package us.shandian.giga.ui.fragment; import android.app.Activity; import android.app.Fragment; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.R; import us.shandian.giga.service.DownloadManager; import us.shandian.giga.service.DownloadManagerService; import us.shandian.giga.service.DownloadManagerService.DMBinder; import us.shandian.giga.ui.adapter.MissionAdapter; public class MissionsFragment extends Fragment { private static final int SPAN_SIZE = 2; private SharedPreferences mPrefs; private boolean mLinear; private MenuItem mSwitch; private MenuItem mClear; private RecyclerView mList; private View mEmpty; private MissionAdapter mAdapter; private GridLayoutManager mGridManager; private LinearLayoutManager mLinearManager; private Context mActivity; private DMBinder mBinder; private Bundle mBundle; private boolean mForceUpdate; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { mBinder = (DownloadManagerService.DMBinder) binder; mBinder.resetFinishedDownloadCount(); mAdapter = new MissionAdapter(mActivity, mBinder.getDownloadManager(), mClear, mEmpty); mAdapter.deleterLoad(mBundle, getView()); mBundle = null; mBinder.addMissionEventListener(mAdapter.getMessenger()); updateList(); } @Override public void onServiceDisconnected(ComponentName name) { // What to do? } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.missions, container, false); mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); mLinear = mPrefs.getBoolean("linear", false); mActivity = getActivity(); mBundle = savedInstanceState; // Bind the service mActivity.bindService(new Intent(mActivity, DownloadManagerService.class), mConnection, Context.BIND_AUTO_CREATE); // Views mEmpty = v.findViewById(R.id.list_empty_view); mList = v.findViewById(R.id.mission_recycler); // Init mGridManager = new GridLayoutManager(getActivity(), SPAN_SIZE); mGridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { switch (mAdapter.getItemViewType(position)) { case DownloadManager.SPECIAL_PENDING: case DownloadManager.SPECIAL_FINISHED: return SPAN_SIZE; default: return 1; } } }); mLinearManager = new LinearLayoutManager(getActivity()); setHasOptionsMenu(true); return v; } /** * Added in API level 23. */ @Override public void onAttach(Context activity) { super.onAttach(activity); // Bug: in api< 23 this is never called // so mActivity=null // so app crashes with nullpointer exception mActivity = activity; } /** * deprecated in API level 23, * but must remain to allow compatibility with api<23 */ @Override public void onAttach(Activity activity) { super.onAttach(activity); mActivity = activity; } @Override public void onDestroy() { super.onDestroy(); if (mBinder == null || mAdapter == null) return; mBinder.removeMissionEventListener(mAdapter.getMessenger()); mActivity.unbindService(mConnection); mAdapter.deleterDispose(null); mBinder = null; mAdapter = null; } @Override public void onPrepareOptionsMenu(Menu menu) { mSwitch = menu.findItem(R.id.switch_mode); mClear = menu.findItem(R.id.clear_list); super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.switch_mode: mLinear = !mLinear; updateList(); return true; case R.id.clear_list: mAdapter.clearFinishedDownloads(); return true; default: return super.onOptionsItemSelected(item); } } private void updateList() { if (mLinear) { mList.setLayoutManager(mLinearManager); } else { mList.setLayoutManager(mGridManager); } // destroy all created views in the recycler mList.setAdapter(null); mAdapter.notifyDataSetChanged(); // re-attach the adapter in grid/lineal mode mAdapter.setLinear(mLinear); mList.setAdapter(mAdapter); if (mSwitch != null) { mSwitch.setIcon(mLinear ? R.drawable.grid : R.drawable.list); mSwitch.setTitle(mLinear ? R.string.grid : R.string.list); mPrefs.edit().putBoolean("linear", mLinear).apply(); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mAdapter != null) { mAdapter.deleterDispose(outState); mForceUpdate = true; mBinder.removeMissionEventListener(mAdapter.getMessenger()); } } @Override public void onResume() { super.onResume(); if (mAdapter != null) { mAdapter.deleterResume(); if (mForceUpdate) { mForceUpdate = false; mAdapter.forceUpdate(); } mBinder.addMissionEventListener(mAdapter.getMessenger()); } } }