/* * ____.____ __.____ ___ _____ * | | |/ _| | \ / _ \ ______ ______ * | | < | | / / /_\ \\____ \\____ \ * /\__| | | \| | / / | \ |_> > |_> > * \________|____|__ \______/ \____|__ / __/| __/ * \/ \/|__| |__| * * Copyright (c) 2014-2015 Paul "Marunjar" Pretsch * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> * */ package org.voidsink.anewjkuapp.fragment; import android.accounts.Account; import android.content.Context; import android.content.Intent; import android.content.UriMatcher; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; 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.TextView; import org.voidsink.anewjkuapp.KusssContentContract; import org.voidsink.anewjkuapp.R; import org.voidsink.anewjkuapp.base.BaseContentObserver; import org.voidsink.anewjkuapp.base.BaseFragment; import org.voidsink.anewjkuapp.base.ContentObserverListener; import org.voidsink.anewjkuapp.base.RecyclerArrayAdapter; import org.voidsink.anewjkuapp.kusss.Curriculum; import org.voidsink.anewjkuapp.provider.KusssContentProvider; import org.voidsink.anewjkuapp.update.ImportCurriculaTask; import org.voidsink.anewjkuapp.update.UpdateService; import org.voidsink.anewjkuapp.utils.AppUtils; import org.voidsink.anewjkuapp.utils.Consts; import org.voidsink.sectionedrecycleradapter.SectionedAdapter; import org.voidsink.sectionedrecycleradapter.SectionedRecyclerViewAdapter; import java.text.DateFormat; import java.util.ArrayList; import java.util.List; public class CurriculaFragment extends BaseFragment implements ContentObserverListener, LoaderManager.LoaderCallbacks<Cursor> { private static final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT); private CurriculaAdapter mAdapter; private BaseContentObserver mObserver; private RecyclerView mRecyclerView; @Override public void onStart() { super.onStart(); UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(KusssContentContract.AUTHORITY, KusssContentContract.Curricula.PATH_CONTENT_CHANGED, 0); mObserver = new BaseContentObserver(uriMatcher, this); getActivity().getContentResolver().registerContentObserver( KusssContentContract.Curricula.CONTENT_CHANGED_URI, false, mObserver); } @Override public void onStop() { super.onStop(); getActivity().getContentResolver().unregisterContentObserver( mObserver); mObserver = null; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_recycler_view, container, false); mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new CurriculaAdapter(getContext()); mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); mRecyclerView.setAdapter(new SectionedRecyclerViewAdapter(mRecyclerView, mAdapter)); getLoaderManager().initLoader(0, null, this); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.curricula, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_refresh_curricula: { Intent mUpdateService = new Intent(getActivity(), UpdateService.class); mUpdateService.putExtra(Consts.ARG_UPDATE_KUSSS_CURRICULA, true); getActivity().startService(mUpdateService); return true; } default: return super.onOptionsItemSelected(item); } } @Override public void onContentChanged(boolean selfChange) { getLoaderManager().restartLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(getContext(), KusssContentContract.Curricula.CONTENT_URI, ImportCurriculaTask.CURRICULA_PROJECTION, null, null, KusssContentContract.Curricula.COL_DT_START + " DESC"); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.clear(); List<Curriculum> mCurriculum = new ArrayList<>(); if (data != null) { Account mAccount = AppUtils.getAccount(getContext()); if (mAccount != null) { mCurriculum = KusssContentProvider.getCurriculaFromCursor(getContext(), data); } } mAdapter.addAll(mCurriculum); mAdapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.clear(); mAdapter.notifyDataSetChanged(); } private static class CurriculaAdapter extends RecyclerArrayAdapter<Curriculum, CurriculumViewHolder> implements SectionedAdapter<CurriculumHeaderHolder> { public CurriculaAdapter(Context context) { super(context); } @Override public CurriculumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.curricula_list_item, parent, false); return new CurriculumViewHolder(v); } @Override public void onBindViewHolder(CurriculumViewHolder holder, int position) { Curriculum item = getItem(position); holder.isStandard.setText(item.isStandard() ? getContext().getString(R.string.curriculum_is_standard_yes) : getContext().getString(R.string.curriculum_is_standard_no)); holder.cid.setText(item.getCid()); holder.title.setText(item.getTitle()); holder.steopDone.setText(item.isSteopDone() ? getContext().getString(R.string.curriculum_steop_done_yes) : getContext().getString(R.string.curriculum_steop_done_no)); holder.activeStatus.setText(item.isActive() ? getContext().getString(R.string.curriculum_active_status_yes) : getContext().getString(R.string.curriculum_active_status_no)); if (item.getDtStart() != null) { holder.dtStart.setText(dateFormat.format(item.getDtStart())); } if (item.getDtEnd() != null) { holder.dtEnd.setText(dateFormat.format(item.getDtEnd())); } } @Override public long getHeaderId(int i) { Curriculum curriculum = getItem(i); if (curriculum != null) { return (long) curriculum.getUni().hashCode() + (long) Integer.MAX_VALUE; // header id has to be > 0??? } return 0; } @Override public CurriculumHeaderHolder onCreateHeaderViewHolder(ViewGroup viewGroup) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_header, viewGroup, false); return new CurriculumHeaderHolder(v); } @Override public void onBindHeaderViewHolder(CurriculumHeaderHolder curriculumHeaderHolder, int position) { Curriculum curriculum = getItem(position); curriculumHeaderHolder.mText.setText(curriculum.getUni()); } } public static class CurriculumViewHolder extends RecyclerView.ViewHolder { public final TextView isStandard; public final TextView cid; public final TextView title; public final TextView steopDone; public final TextView activeStatus; public final TextView dtStart; public final TextView dtEnd; public CurriculumViewHolder(View itemView) { super(itemView); isStandard = (TextView) itemView.findViewById(R.id.curriculum_is_standard); cid = (TextView) itemView.findViewById(R.id.curriculum_id); title = (TextView) itemView.findViewById(R.id.curriculum_title); steopDone = (TextView) itemView.findViewById(R.id.curriculum_steop_done); activeStatus = (TextView) itemView.findViewById(R.id.curriculum_active_status); dtStart = (TextView) itemView.findViewById(R.id.curriculum_dt_start); dtEnd = (TextView) itemView.findViewById(R.id.curriculum_dt_end); } } public static class CurriculumHeaderHolder extends RecyclerView.ViewHolder { public final TextView mText; public CurriculumHeaderHolder(View itemView) { super(itemView); mText = (TextView) itemView.findViewById(R.id.list_header_text); } } @Override protected String getScreenName() { return Consts.SCREEN_CURRICULA; } }