package fridge.site.tivra.fridgeforcodechef.Fragments; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; import fridge.site.tivra.fridgeforcodechef.AboutActivity; import fridge.site.tivra.fridgeforcodechef.Adapters.ContestsListAdapter; import fridge.site.tivra.fridgeforcodechef.DataModels.Contest; import fridge.site.tivra.fridgeforcodechef.R; public class OfflineContestsFragment extends Fragment { LinearLayoutManager linearLayoutManager; RecyclerView recyclerView; ContestsListAdapter contestsListAdapter; SwipeRefreshLayout swipeRefreshLayout; ArrayList<Contest> contests; TextView offlineContestsPlaceholder; android.support.v7.widget.SearchView searchView; String filter; View rootView; int positionIndex; int topView; public OfflineContestsFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_offline_contests_list, container, false); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); rootView = getActivity().findViewById(R.id.root_offline_contsets); recyclerView = getActivity().findViewById(R.id.offline_contests_recycler_view); contests = new ArrayList<Contest>(); offlineContestsPlaceholder = getActivity().findViewById(R.id.offline_contests_placeholder); contestsListAdapter = new ContestsListAdapter(contests, getActivity()); recyclerView.setAdapter(contestsListAdapter); linearLayoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(linearLayoutManager); swipeRefreshLayout = getActivity().findViewById(R.id.offline_contests_swipe_refresh_layout); if (savedInstanceState == null || !savedInstanceState.containsKey("contests")) { swipeRefreshLayout.setRefreshing(true); getContests(); } swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { getContests(); } }); } public void getContests() { File folder = getActivity().getFilesDir(); File[] files = folder.listFiles(); contests.clear(); for (int i = files.length - 1; i >= 0; i--) { if (files[i].isFile() && files[i].getName().contains(".contest")) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(files[i]); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream, Charset.forName("UTF-8"))); String name = bufferedReader.readLine(); String startDate = bufferedReader.readLine(); String endDate = bufferedReader.readLine(); String code = files[i].getName().replaceAll(".contest", ""); Contest contest = new Contest(code, name, startDate, endDate, -1); contests.add(contest); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } swipeRefreshLayout.setRefreshing(false); contestsListAdapter = new ContestsListAdapter(contests, getActivity()); recyclerView.swapAdapter(contestsListAdapter, true); if (filter != null) contestsListAdapter.setFilter(filter); if (contests == null || contests.isEmpty()) { recyclerView.setVisibility(View.GONE); offlineContestsPlaceholder.setVisibility(View.VISIBLE); } else { recyclerView.setVisibility(View.VISIBLE); offlineContestsPlaceholder.setVisibility(View.GONE); } } @Override public void onAttach(Context context) { super.onAttach(context); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main_action_menu, menu); searchView = (android.support.v7.widget.SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.clearFocus(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.about_button: Intent i = new Intent(getContext(), AboutActivity.class); getActivity().startActivity(i); break; case R.id.license_button: LicenseFragment alertDialog = new LicenseFragment(); alertDialog.setCancelable(true); alertDialog.show(getActivity().getSupportFragmentManager(), "Tag"); break; case R.id.share_menu_main: Intent sharingIntent = new Intent(Intent.ACTION_SEND); sharingIntent.setType("text/plain"); sharingIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name)); sharingIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text)); startActivity(Intent.createChooser(sharingIntent, "Share app via")); break; } return true; } @Override public void onPrepareOptionsMenu(Menu menu) { searchView = (android.support.v7.widget.SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setIconifiedByDefault(false); searchView.setIconified(false); searchView.setQueryHint("Enter contest name or code"); searchView.setQuery(filter, true); View v = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate); if (v != null) v.setBackgroundColor(Color.TRANSPARENT); SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); searchAutoComplete.setTextColor(Color.WHITE); searchAutoComplete.setHintTextColor(Color.LTGRAY); searchView.setBackground(getResources().getDrawable(R.drawable.search_bar_bg)); ImageView searchIcon = searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon); searchIcon.setLayoutParams(new LinearLayout.LayoutParams(0, 0)); searchView.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { filter = query; contestsListAdapter.setFilter(query); return true; } @Override public boolean onQueryTextChange(String newText) { filter = newText; contestsListAdapter.setFilter(newText); return true; } }); searchView.clearFocus(); } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelableArrayList("contests", contests); rememberScrollPosition(); outState.putInt("pos", positionIndex); outState.putInt("top", topView); } @Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); if (savedInstanceState != null && savedInstanceState.containsKey("contests")) { contests = savedInstanceState.getParcelableArrayList("contests"); contestsListAdapter = new ContestsListAdapter(contests, getActivity()); recyclerView.swapAdapter(contestsListAdapter, false); contestsListAdapter.setFilter(filter); if (savedInstanceState.containsKey("pos") && savedInstanceState.containsKey("top")) { positionIndex = savedInstanceState.getInt("pos"); topView = savedInstanceState.getInt("top"); setScrollPosition(); } } } @Override public void onResume() { super.onResume(); getContests(); rootView.requestFocus(); if (searchView != null) { filter = searchView.getQuery().toString(); searchView.clearFocus(); } contestsListAdapter.setFilter(filter); setScrollPosition(); } @Override public void onPause() { super.onPause(); rememberScrollPosition(); } @Override public void onDetach() { super.onDetach(); } public void rememberScrollPosition() { positionIndex = linearLayoutManager.findFirstVisibleItemPosition(); View startView = recyclerView.getChildAt(0); topView = (startView == null) ? 0 : (startView.getTop() - recyclerView.getPaddingTop()); } public void setScrollPosition() { if (positionIndex != -1) { linearLayoutManager.scrollToPositionWithOffset(positionIndex, topView); } } }