package info.papdt.express.helper.ui.fragment; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView; import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; import com.github.ksoichiro.android.observablescrollview.ScrollUtils; import org.json.JSONException; import java.io.IOException; import info.papdt.express.helper.R; import info.papdt.express.helper.dao.ExpressDatabase; import info.papdt.express.helper.support.Settings; import info.papdt.express.helper.ui.DetailsActivity; import info.papdt.express.helper.ui.MainActivity; import info.papdt.express.helper.ui.adapter.HomeCardRecyclerAdapter; import info.papdt.express.helper.ui.common.MyRecyclerViewAdapter; public abstract class BaseHomeFragment extends Fragment { public ExpressDatabase mDB; protected Settings mSets; protected SwipeRefreshLayout refreshLayout; protected ObservableRecyclerView mRecyclerView; protected View headerView; protected Context context; public static final int FLAG_REFRESH_LIST = 0, FLAG_REFRESH_ADAPTER_ONLY = 1; public static final String ARG_INITIAL_POSITION = "initial_position"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_home, container, false); if (mSets == null) { mSets = Settings.getInstance(getActivity().getApplicationContext()); } refreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipeRefreshLayout); mRecyclerView = (ObservableRecyclerView) rootView.findViewById(R.id.scroll); mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); mRecyclerView.setHasFixedSize(true); headerView = inflater.inflate(R.layout.padding, null); Activity parentActivity = getActivity(); context = parentActivity.getApplicationContext(); if (parentActivity instanceof ObservableScrollViewCallbacks) { // Scroll to the specified position after layout Bundle args = getArguments(); if (args != null && args.containsKey(ARG_INITIAL_POSITION)) { final int initialPosition = args.getInt(ARG_INITIAL_POSITION, 0); ScrollUtils.addOnGlobalLayoutListener(mRecyclerView, new Runnable() { @Override public void run() { mRecyclerView.scrollVerticallyToPosition(initialPosition); } }); } mRecyclerView.setScrollViewCallbacks((ObservableScrollViewCallbacks) parentActivity); } refreshLayout.setProgressViewEndTarget( true, getResources().getDimensionPixelOffset(R.dimen.abc_action_bar_default_height_material) + getResources().getDimensionPixelOffset(R.dimen.tab_height) ); refreshLayout.setColorSchemeResources(R.color.blue_500); refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { mHandler.sendEmptyMessage(FLAG_REFRESH_LIST); } }); mDB = ((MainActivity) getActivity()).mExpressDB; setUpAdapter(); return rootView; } public abstract void setUpAdapter(); public void scrollToTopItem() { mRecyclerView.smoothScrollToPosition(1); } private void showDeleteDialog(final int realPosition) { new MaterialDialog.Builder(getActivity()) .title(R.string.dialog_delete_title) .content(R.string.dialog_delete_msg) .positiveText(android.R.string.ok) .negativeText(android.R.string.cancel) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { super.onPositive(dialog); mDB.deleteExpress(realPosition); try { mDB.save(); } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mRecyclerView.getAdapter().notifyDataSetChanged(); } }) .show(); } protected void setUpAdapterListener() { MyRecyclerViewAdapter adapter = (MyRecyclerViewAdapter) mRecyclerView.getAdapter(); adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemClickListener() { @Override public void onItemClicked(int position) { if (position == 0) return; HomeCardRecyclerAdapter adapter = (HomeCardRecyclerAdapter) mRecyclerView.getAdapter(); int realPosition = mDB.findExpress( adapter.getItem(position - 1).getCompanyCode(), adapter.getItem(position - 1).getMailNumber() ); Intent intent = new Intent(getActivity(), DetailsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); intent.putExtra("id", realPosition); intent.putExtra("data", mDB.getExpress(realPosition).toJSONObject().toString()); getActivity().startActivityForResult(intent, MainActivity.REQUEST_DETAILS); } }); adapter.setOnItemLongClickListener(new MyRecyclerViewAdapter.OnItemLongClickListener() { @Override public boolean onItemLongClicked(int position) { if (position == 0) return false; HomeCardRecyclerAdapter adapter = (HomeCardRecyclerAdapter) mRecyclerView.getAdapter(); int realPosition = mDB.findExpress( adapter.getItem(position - 1).getCompanyCode(), adapter.getItem(position - 1).getMailNumber() ); showDeleteDialog(realPosition); return true; } }); } public Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case FLAG_REFRESH_LIST: if (!refreshLayout.isRefreshing()) { refreshLayout.setRefreshing(true); } new RefreshTask().execute(); break; case FLAG_REFRESH_ADAPTER_ONLY: mDB.init(); setUpAdapter(); break; } } }; private class RefreshTask extends AsyncTask<Void, Void, ExpressDatabase> { @Override protected ExpressDatabase doInBackground(Void... params) { try { ((MainActivity) getActivity()).refreshDatabase(true); return ((MainActivity) getActivity()).mExpressDB; } catch (Exception e) { // failed return null; } } @Override protected void onPostExecute(ExpressDatabase db) { refreshLayout.setRefreshing(false); if (db != null) { mDB = db; } else { Toast.makeText( context, R.string.toast_network_error, Toast.LENGTH_SHORT ).show(); } if (mDB != null) { setUpAdapter(); } } } }