package edu.mit.mobile.android.livingpostcards; /* * Copyright (C) 2012-2013 MIT Mobile Experience Lab * * 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 version 2 * of the License. * * 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/>. */ import android.app.Activity; import android.database.Cursor; import android.extracted.widget.AdapterViewFlipper; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import edu.mit.mobile.android.content.ProviderUtils; import edu.mit.mobile.android.flipr.BuildConfig; import edu.mit.mobile.android.flipr.R; import edu.mit.mobile.android.imagecache.ImageCache; import edu.mit.mobile.android.imagecache.ImageCache.OnImageLoadListener; import edu.mit.mobile.android.imagecache.ImageLoaderAdapter; import edu.mit.mobile.android.imagecache.SimpleThumbnailCursorAdapter; import edu.mit.mobile.android.livingpostcards.auth.Authenticator; import edu.mit.mobile.android.livingpostcards.data.Card; import edu.mit.mobile.android.livingpostcards.data.CardMedia; import edu.mit.mobile.android.locast.app.LocastApplication; import edu.mit.mobile.android.locast.net.NetworkClient; import edu.mit.mobile.android.locast.sync.LocastSyncService; /** * Views a single card. * */ public class CardViewFragment extends Fragment implements LoaderCallbacks<Cursor>, OnImageLoadListener { /** * The card URI */ public static final String ARGUMENT_URI = "uri"; private ImageCache mImageCache; private Uri mCard; private AdapterViewFlipper mCardImage; private int mTiming; private SimpleThumbnailCursorAdapter mAdapter; private Uri mCardMedia; private final static int LOADER_CARD = 100, LOADER_CARDMEDIA = 101; private static final String[] CARD_PROJECTION = new String[] { Card._ID, Card.COL_TIMING, Card.COL_MEDIA_URL }; private static final String[] CARD_MEDIA_PROJECTION = new String[] { CardMedia._ID, CardMedia.COL_LOCAL_URL, CardMedia.COL_MEDIA_URL }; private static final String[] CARD_MEDIA_FROM = new String[] { CardMedia.COL_LOCAL_URL, CardMedia.COL_MEDIA_URL }; private static final int[] CARD_MEDIA_TO = new int[] { R.id.card_media_thumbnail, R.id.card_media_thumbnail }; private static final int[] IMAGE_VIEW_IDS = new int[] { R.id.card_media_thumbnail }; public static CardViewFragment newInstance(Uri card) { final CardViewFragment cmf = new CardViewFragment(); final Bundle args = new Bundle(); args.putParcelable(ARGUMENT_URI, card); cmf.setArguments(args); return cmf; } @Override public void onAttach(Activity activity) { super.onAttach(activity); mImageCache = ImageCache.getInstance(activity); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mCard = getArguments().getParcelable(ARGUMENT_URI); if (mCard != null) { mCardMedia = Card.MEDIA.getUri(mCard); getLoaderManager().initLoader(LOADER_CARD, null, this); getLoaderManager().initLoader(LOADER_CARDMEDIA, null, this); } } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View v = inflater.inflate(R.layout.card_view_fragment, container, false); mCardImage = (AdapterViewFlipper) v.findViewById(R.id.card_image); return v; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { mAdapter = new SimpleThumbnailCursorAdapter(getActivity(), R.layout.card_media_fullsize, null, CARD_MEDIA_FROM, CARD_MEDIA_TO, IMAGE_VIEW_IDS, 0); mCardImage.setAdapter(new ImageLoaderAdapter(getActivity(), mAdapter, mImageCache, IMAGE_VIEW_IDS, 200, 200, ImageLoaderAdapter.UNIT_DIP)); } @Override public void onPause() { super.onPause(); mImageCache.unregisterOnImageLoadListener(this); mCardImage.stopFlipping(); } @Override public void onResume() { super.onResume(); mImageCache.registerOnImageLoadListener(this); if (mTiming != 0) { mCardImage.startFlipping(); } LocastSyncService.startExpeditedAutomaticSync(getActivity(), mCard); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { switch (id) { case LOADER_CARD: return new CursorLoader(getActivity(), mCard, CARD_PROJECTION, null, null, null); case LOADER_CARDMEDIA: return new CursorLoader(getActivity(), mCardMedia, CARD_MEDIA_PROJECTION, null, null, null); default: return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor c) { switch (loader.getId()) { case LOADER_CARD: if (c.moveToFirst()) { if (BuildConfig.DEBUG) { ProviderUtils.dumpCursorToLog(c, CARD_PROJECTION); } mTiming = c.getInt(c.getColumnIndexOrThrow(Card.COL_TIMING)); mCardImage.setFlipInterval(mTiming); mCardImage.startFlipping(); final String pubMediaUri = c.getString(c .getColumnIndexOrThrow(Card.COL_MEDIA_URL)); if (pubMediaUri != null) { final NetworkClient nc = LocastApplication.getNetworkClient(getActivity(), Authenticator.getFirstAccount(getActivity())); LocastSyncService.startSync(getActivity(), nc.getFullUrl(pubMediaUri), mCardMedia, false); } } break; case LOADER_CARDMEDIA: mAdapter.setExpectedCount(c.getCount()); if (BuildConfig.DEBUG) { if (c.moveToFirst()) { ProviderUtils.dumpCursorToLog(c, CARD_MEDIA_PROJECTION); } } mAdapter.swapCursor(c); break; } } @Override public void onLoaderReset(Loader<Cursor> loader) { switch (loader.getId()) { case LOADER_CARDMEDIA: mAdapter.swapCursor(null); break; } } @Override public void onImageLoaded(int id, Uri imageUri, Drawable image) { if (id == R.id.card_image) { // TODO } } public boolean checkAllCached() { final boolean allCached = true; if (mAdapter == null) { return false; } final Cursor c = mAdapter.getCursor(); final int imgLocCol = c.getColumnIndexOrThrow(CardMedia.COL_LOCAL_URL); final int imgPubCol = c.getColumnIndexOrThrow(CardMedia.COL_MEDIA_URL); if (c == null || c.isClosed()) { return false; } for (c.moveToFirst(); c.isAfterLast(); c.moveToNext()) { String url = c.getString(imgLocCol); if (url == null) { url = c.getString(imgPubCol); } } return false; } @Override public void onImageLoaded(long id, Uri imageUri, Drawable image) { // XXX } }