Add minimal detail view as a fragment

This commit is contained in:
YuviPanda 2013-02-21 21:09:04 +05:30
parent de39502292
commit 0cb11284ff
7 changed files with 238 additions and 7 deletions

View file

@ -1,5 +1,6 @@
package org.wikimedia.commons.contributions;
import android.*;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
@ -16,21 +17,27 @@ import android.widget.AdapterView;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import org.wikimedia.commons.*;
import org.wikimedia.commons.R;
import org.wikimedia.commons.auth.AuthenticatedActivity;
import org.wikimedia.commons.auth.WikiAccountAuthenticator;
import org.wikimedia.commons.media.MediaDetailPagerFragment;
import java.io.File;
import java.io.IOException;
import java.util.Date;
// Inherit from SherlockFragmentActivity but not use Fragments. Because Loaders are available only from FragmentActivities
public class ContributionsActivity extends AuthenticatedActivity implements LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
public class ContributionsActivity
extends AuthenticatedActivity
implements LoaderManager.LoaderCallbacks<Cursor>,
AdapterView.OnItemClickListener,
MediaDetailPagerFragment.MediaDetailProvider {
private final static int SELECT_FROM_GALLERY = 1;
private final static int SELECT_FROM_CAMERA = 2;
private Cursor allContributions;
private ContributionsListFragment contributionsList;
private MediaDetailPagerFragment mediaDetails;
public ContributionsActivity() {
super(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE);
@ -105,6 +112,19 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
requestAuthToken();
}
private void showDetail(int i) {
if(mediaDetails == null ||!mediaDetails.isVisible()) {
mediaDetails = new MediaDetailPagerFragment();
this.getSupportFragmentManager()
.beginTransaction()
.replace(R.id.contributionsFragmentContainer, mediaDetails)
.addToBackStack(null)
.commit();
this.getSupportFragmentManager().executePendingTransactions();
}
mediaDetails.showImage(i);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelable("lastGeneratedCaptureURI", lastGeneratedCaptureURI);
@ -201,6 +221,9 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
if(c.getState() == Contribution.STATE_FAILED) {
uploadService.queue(UploadService.ACTION_UPLOAD_FILE, c);
Log.d("Commons", "Restarting for" + c.toContentValues().toString());
} else {
Log.d("Commons", "CLicking for " + c.toContentValues());
showDetail(position);
}
Log.d("Commons", "You clicked on:" + c.toContentValues().toString());
}
@ -224,4 +247,15 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
contributionsList.setCursor(null);
}
public Media getItem(int i) {
allContributions.moveToPosition(i);
return Contribution.fromCursor(allContributions);
}
public int getCount() {
if(allContributions == null) {
return 0;
}
return allContributions.getCount();
}
}

View file

@ -0,0 +1,66 @@
package org.wikimedia.commons.media;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import org.wikimedia.commons.Media;
import org.wikimedia.commons.R;
import org.wikimedia.commons.Utils;
public class MediaDetailFragment extends SherlockFragment {
private Media media;
private DisplayImageOptions displayOptions;
public static MediaDetailFragment forMedia(Media media) {
MediaDetailFragment mf = new MediaDetailFragment();
mf.media = media;
return mf;
}
private ImageView image;
private TextView title;
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("media", media);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(media == null) {
media = (Media)savedInstanceState.get("media");
}
View view = inflater.inflate(R.layout.fragment_media_detail, container, false);
image = (ImageView) view.findViewById(R.id.mediaDetailImage);
title = (TextView) view.findViewById(R.id.mediaDetailTitle);
String actualUrl = TextUtils.isEmpty(media.getImageUrl()) ? media.getLocalUri().toString() : media.getThumbnailUrl(640);
ImageLoader.getInstance().displayImage(actualUrl, image, displayOptions);
title.setText(Utils.displayTitleFromTitle(media.getFilename()));
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
displayOptions = new DisplayImageOptions.Builder().cacheInMemory()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.displayer(new FadeInBitmapDisplayer(300))
.cacheInMemory()
.cacheOnDisc()
.resetViewBeforeLoading().build();
}
}

View file

@ -0,0 +1,73 @@
package org.wikimedia.commons.media;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.ShareActionProvider;
import org.wikimedia.commons.Media;
import org.wikimedia.commons.R;
public class MediaDetailPagerFragment extends SherlockFragment {
private ViewPager pager;
private ShareActionProvider shareActionProvider;
public interface MediaDetailProvider {
public Media getItem(int i);
public int getCount();
}
private class MediaDetailAdapter extends FragmentStatePagerAdapter {
public MediaDetailAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Media m = ((MediaDetailProvider)getActivity()).getItem(i);
return MediaDetailFragment.forMedia((m));
}
@Override
public int getCount() {
return ((MediaDetailProvider)getActivity()).getCount();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_media_detail_pager, container, false);
pager = (ViewPager) view.findViewById(R.id.mediaDetailsPager);
pager.setAdapter(new MediaDetailAdapter(getChildFragmentManager()));
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
public void showImage(int i) {
pager.setCurrentItem(i);
}
}