package org.marcinzelent.liberavem;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Html;
import android.text.Spanned;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.jetbrains.annotations.Nullable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link AboutFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link AboutFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class AboutFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public AboutFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment AboutFragment.
*/
// TODO: Rename and change types and number of parameters
public static AboutFragment newInstance(String param1, String param2) {
AboutFragment fragment = new AboutFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
((MainActivity) getActivity()).setActionBarTitle("About");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_about, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
InputStream inputStream = this.getResources().openRawResource(R.raw.gpl_3);
InputStreamReader inputreader = new InputStreamReader(inputStream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
StringBuilder text = new StringBuilder();
try {
while (( line = buffreader.readLine()) != null) {
text.append(line);
text.append('\n');
}
} catch (IOException e) { }
Spanned license = Html.fromHtml(text.toString());
TextView aboutLicense = view.findViewById(R.id.about_license);
aboutLicense.setText(license);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
*
* See the Android Training lesson Communicating with Other Fragments for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 3067
Content-Disposition: inline; filename="AllObservationsFragment.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "b54227c6f78e96da77a2504b18157837e24ad77b"
package org.marcinzelent.liberavem;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.jetbrains.annotations.Nullable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* A simple {@link Fragment} subclass.
*/
public class AllObservationsFragment extends Fragment {
public AllObservationsFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.observations_list, container, false);
return rootView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
final SwipeRefreshLayout sfl = view.findViewById(R.id.swiperefresh);
sfl.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
DataKeeper.getInstance().downloadData(getActivity());
sfl.setRefreshing(false);
}
}
);
DataKeeper.getInstance().addFragment(this);
DataKeeper.getInstance().downloadData(getActivity());
}
public void populateList(final Observation[] observations, final Bird[] birds) {
final ListView observationsListView = getView().findViewById(R.id.observations_list_view);
observationsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> arg0, View arg1, int position, long arg3) {
Intent detailsIntent = new Intent(getActivity(), ObservationDetailsActivity.class);
detailsIntent.putExtra("Observation", observations[position]);
String photoUrl = "";
for (Bird bird : birds)
if (bird.getId() == observations[position].getBirdId())
photoUrl = bird.getPhotoUrl();
detailsIntent.putExtra("Photo", photoUrl);
startActivity(detailsIntent);
}
});
final ObservationsListAdapter adapter = new ObservationsListAdapter(getActivity(), observations, birds);
observationsListView.setAdapter(adapter);
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 3000
Content-Disposition: inline; filename="AppCompatPreferenceActivity.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "f63b0b5b1faed8476f19a0b10c615a081b107db0"
package org.marcinzelent.liberavem;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
* to be used with AppCompat.
*/
public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
private AppCompatDelegate mDelegate;
@Override
protected void onCreate(Bundle savedInstanceState) {
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
getDelegate().onPostCreate(savedInstanceState);
}
public ActionBar getSupportActionBar() {
return getDelegate().getSupportActionBar();
}
public void setSupportActionBar(@Nullable Toolbar toolbar) {
getDelegate().setSupportActionBar(toolbar);
}
@Override
public MenuInflater getMenuInflater() {
return getDelegate().getMenuInflater();
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
getDelegate().setContentView(layoutResID);
}
@Override
public void setContentView(View view) {
getDelegate().setContentView(view);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
getDelegate().setContentView(view, params);
}
@Override
public void addContentView(View view, ViewGroup.LayoutParams params) {
getDelegate().addContentView(view, params);
}
@Override
protected void onPostResume() {
super.onPostResume();
getDelegate().onPostResume();
}
@Override
protected void onTitleChanged(CharSequence title, int color) {
super.onTitleChanged(title, color);
getDelegate().setTitle(title);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
getDelegate().onConfigurationChanged(newConfig);
}
@Override
protected void onStop() {
super.onStop();
getDelegate().onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
getDelegate().onDestroy();
}
public void invalidateOptionsMenu() {
getDelegate().invalidateOptionsMenu();
}
private AppCompatDelegate getDelegate() {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, null);
}
return mDelegate;
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 4041
Content-Disposition: inline; filename="AtlasFragment.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "f59ff6bec351a4e7ab0f818ade1299ec38fdf90c"
package org.marcinzelent.liberavem;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import org.jetbrains.annotations.Nullable;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link AtlasFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link AtlasFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class AtlasFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public AtlasFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment AtlasFragment.
*/
// TODO: Rename and change types and number of parameters
public static AtlasFragment newInstance(String param1, String param2) {
AtlasFragment fragment = new AtlasFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
((MainActivity) getActivity()).setActionBarTitle("Atlas");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_atlas, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
GridView atlasGrid = view.findViewById(R.id.atlas_grid);
atlasGrid.setAdapter(new AtlasGridAdapter(getActivity(), DataKeeper.getInstance().getBirds()));
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
*
* See the Android Training lesson Communicating with Other Fragments for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 1825
Content-Disposition: inline; filename="AtlasGridAdapter.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "0aa1ca5c7b27d6e1349ceab4646c6df59905618a"
package org.marcinzelent.liberavem;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
public class AtlasGridAdapter extends BaseAdapter {
private Context mContext;
private Bird[] birds;
public AtlasGridAdapter(Context c, Bird[] b) {
mContext = c;
birds = b;
}
public int getCount() {
return birds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(R.layout.atlas_grid_item, parent, false);
viewHolder.photo = convertView.findViewById(R.id.atlas_photo);
viewHolder.name = convertView.findViewById(R.id.atlas_name);
result = convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result = convertView;
}
Picasso.get().load(birds[position].getPhotoUrl()).into(viewHolder.photo);
viewHolder.name.setText(birds[position].getNameEnglish());
return convertView;
}
private static class ViewHolder {
ImageView photo;
TextView name;
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 1142
Content-Disposition: inline; filename="Bird.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "a94faf32f97ec8043572ec9c5c520f00b8165ca9"
package org.marcinzelent.liberavem;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
public class Bird implements Serializable {
@SerializedName("Id")
private int id;
@SerializedName("Created")
private String created;
@SerializedName("NameEnglish")
private String nameEnglish;
@SerializedName("NameDanish")
private String nameDanish;
@SerializedName("PhotoUrl")
private String photoUrl;
public Bird(int id, String created, String nameEnglish, String nameDanish, String photoUrl) {
this.id = id;
this.created = created;
this.nameEnglish = nameEnglish;
this.nameDanish = nameDanish;
this.photoUrl = photoUrl;
}
public int getId() {
return id;
}
public String getCreated() {
return created;
}
public String getNameEnglish() {
return nameEnglish;
}
public String getNameDanish() {
return nameDanish;
}
public String getPhotoUrl() {
return photoUrl;
}
@Override
public String toString() {
return getNameEnglish();
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 352
Content-Disposition: inline; filename="BirdPickerActivity.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "15c38cf8685cfe9707e17860a3616361ac6065c3"
package org.marcinzelent.liberavem;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class BirdPickerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bird_picker);
}
}
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 1929
Content-Disposition: inline; filename="BirdsListAdapter.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "68896c00a6f2d645e9b5a5cd9a291597cdc413da"
package org.marcinzelent.liberavem;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
public class BirdsListAdapter extends ArrayAdapter {
private final Bird[] birds;
private Context mContext;
public BirdsListAdapter(Context context, Bird[] birds){
super(context, R.layout.observations_list_item);
this.mContext = context;
this.birds = birds;
}
@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
return getView(position, convertView, parent);
}
@Override
public int getCount() {
return birds.length;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder mViewHolder = new ViewHolder();
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.birds_list_item, parent, false);
mViewHolder.name = convertView.findViewById(R.id.bli_name);
mViewHolder.photo = convertView.findViewById(R.id.bli_photo);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (ViewHolder) convertView.getTag();
}
mViewHolder.name.setText(birds[position].getNameEnglish());
Picasso.get().load(birds[position].getPhotoUrl()).into(mViewHolder.photo);
return convertView;
}
private static class ViewHolder {
TextView name;
ImageView photo;
}
}X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'
Content-Type: text/plain; charset=UTF-8
Content-Length: 4749
Content-Disposition: inline; filename="DataKeeper.java"
Last-Modified: Sun, 02 Feb 2025 17:24:05 GMT
Expires: Sun, 02 Feb 2025 17:29:05 GMT
ETag: "172713d8a244e5f14383beaa9c2e87e45a034b85"
package org.marcinzelent.liberavem;
import android.app.Activity;
import android.app.Fragment;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.firebase.auth.FirebaseAuth;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class DataKeeper {
private static final DataKeeper instance = new DataKeeper();
public static DataKeeper getInstance() {
return instance;
}
private DataKeeper() {
}
private List