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 java.io.IOException;
import android.app.Activity;
import android.database.Cursor;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
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.livingpostcards.auth.Authenticator;
import edu.mit.mobile.android.livingpostcards.data.Card;
import edu.mit.mobile.android.locast.app.LocastApplication;
import edu.mit.mobile.android.locast.sync.LocastSyncService;
import edu.mit.mobile.android.maps.GoogleStaticMapView;
import edu.mit.mobile.android.maps.OnMapUpdateListener;
public class CardDetailsFragment extends Fragment implements LoaderCallbacks<Cursor>,
OnImageLoadListener, OnMapUpdateListener {
/**
* The card URI
*/
public static final String ARGUMENT_URI = "uri";
private Uri mCard;
private GoogleStaticMapView mStaticMap;
private int mTiming;
private Uri mCardMedia;
private ImageCache mImageCache;
private final static int LOADER_CARD = 100;
private static final String[] CARD_PROJECTION = new String[] { Card._ID,
Card.COL_ANIMATED_RENDER, Card.COL_DESCRIPTION, Card.COL_COVER_PHOTO, Card.COL_TIMING,
Card.COL_LATITUDE, Card.COL_LONGITUDE, Card.COL_MEDIA_URL };
private static final String TAG = CardDetailsFragment.class.getSimpleName();
public static CardDetailsFragment newInstance(Uri card) {
final CardDetailsFragment cmf = new CardDetailsFragment();
final Bundle args = new Bundle();
args.putParcelable(ARGUMENT_URI, card);
cmf.setArguments(args);
return cmf;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImageCache = ImageCache.getInstance(getActivity());
if (getArguments() != null) {
mCard = getArguments().getParcelable(ARGUMENT_URI);
if (mCard != null) {
mCardMedia = Card.MEDIA.getUri(mCard);
getLoaderManager().initLoader(LOADER_CARD, null, this);
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.card_details_fragment, container, false);
mStaticMap = (GoogleStaticMapView) v.findViewById(R.id.static_map);
mStaticMap.setOnMapUpdateListener(this);
return v;
}
@Override
public void onResume() {
super.onResume();
mImageCache.registerOnImageLoadListener(this);
LocastSyncService.startExpeditedAutomaticSync(getActivity(), mCard);
}
@Override
public void onPause() {
super.onPause();
mImageCache.unregisterOnImageLoadListener(this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
switch (id) {
case LOADER_CARD:
return new CursorLoader(getActivity(), mCard, CARD_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);
}
final View v = getView();
final String description = c.getString(c
.getColumnIndexOrThrow(Card.COL_DESCRIPTION));
final TextView descriptionTv = ((TextView) v.findViewById(R.id.description));
if (description != null && description.length() > 0) {
descriptionTv.setVisibility(View.VISIBLE);
descriptionTv.setText(description);
} else {
descriptionTv.setVisibility(View.GONE);
}
mStaticMap.setMap(c.getFloat(c.getColumnIndexOrThrow(Card.COL_LATITUDE)),
c.getFloat(c.getColumnIndexOrThrow(Card.COL_LONGITUDE)), false);
mTiming = c.getInt(c.getColumnIndexOrThrow(Card.COL_TIMING));
final String pubMediaUri = c.getString(c
.getColumnIndexOrThrow(Card.COL_MEDIA_URL));
if (pubMediaUri != null) {
LocastSyncService.startSync(
getActivity(),
((LocastApplication) getActivity().getApplication())
.getNetworkClient(getActivity(),
Authenticator.getFirstAccount(getActivity()))
.getFullUrl(pubMediaUri), mCardMedia, false);
}
}
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
@Override
public void onMapUpdate(GoogleStaticMapView v, Uri staticMap) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "scheduling load of " + staticMap);
}
try {
final Drawable d = mImageCache.loadImage(v.getId(), staticMap, v.getMapWidth(),
v.getMapHeight());
if (BuildConfig.DEBUG && d != null) {
Log.d(TAG, "set map image immediately");
}
setMapDrawable(d, false);
} catch (final IOException e) {
Log.e(TAG, "error updating static map", e);
}
}
private void setMapDrawable(Drawable image, boolean animate) {
mStaticMap.setImageDrawable(image);
if (animate) {
mStaticMap.startAnimation(AnimationUtils.makeInAnimation(getActivity(), true));
}
mStaticMap.setVisibility(View.VISIBLE);
}
@Override
public void onImageLoaded(int id, Uri imageUri, Drawable image) {
if (id == R.id.static_map) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "loaded " + imageUri + " (id " + id + ")");
}
setMapDrawable(image, true);
}
}
@Override
public void onImageLoaded(long id, Uri imageUri, Drawable image) {
// XXX
}
}