Start using Fragments appropriately

This commit is contained in:
YuviPanda 2013-02-21 12:14:53 +05:30
parent 540b760c76
commit 9476ec6484
4 changed files with 171 additions and 113 deletions

View file

@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<GridView android:id="@+id/contributionsList"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:stretchMode="columnWidth"
android:columnWidth="240dp"
android:numColumns="auto_fit"
android:listSelector="@null"
android:fadingEdge="none"
/>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<fragment
android:name="org.wikimedia.commons.contributions.ContributionsListFragment"
android:id="@+id/contributionsListFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
/>
</LinearLayout>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<GridView android:id="@+id/contributionsList"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:stretchMode="columnWidth"
android:columnWidth="240dp"
android:numColumns="auto_fit"
android:listSelector="@null"
android:fadingEdge="none"
/>
</LinearLayout>

View file

@ -1,6 +1,5 @@
package org.wikimedia.commons.contributions;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.os.IBinder;
@ -11,41 +10,27 @@ import android.support.v4.content.Loader;
import android.content.*;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.content.*;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.ActionMode;
import android.widget.AdapterView;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import org.wikimedia.commons.*;
import org.wikimedia.commons.auth.AuthenticatedActivity;
import org.wikimedia.commons.auth.WikiAccountAuthenticator;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
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> {
public class ContributionsActivity extends AuthenticatedActivity implements LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener {
private final static int SELECT_FROM_GALLERY = 1;
private final static int SELECT_FROM_CAMERA = 2;
private TextView progressUpdateTextView;
private Cursor allContributions;
private ContributionsListFragment contributionsList;
public ContributionsActivity() {
super(WikiAccountAuthenticator.COMMONS_ACCOUNT_TYPE);
@ -63,60 +48,7 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
}
};
private class ContributionAdapter extends CursorAdapter {
public ContributionAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return getLayoutInflater().inflate(R.layout.layout_contribution, viewGroup, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView imageView = (ImageView)view.findViewById(R.id.contributionImage);
TextView titleView = (TextView)view.findViewById(R.id.contributionTitle);
TextView stateView = (TextView)view.findViewById(R.id.contributionState);
Contribution contribution = Contribution.fromCursor(cursor);
String actualUrl = TextUtils.isEmpty(contribution.getImageUrl()) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(320);
Log.d("Commons", "Trying URL " + actualUrl);
Log.d("Commons", "For " + contribution.toContentValues());
if(imageView.getTag() == null || !imageView.getTag().equals(actualUrl)) {
Log.d("Commons", "Tag is " + imageView.getTag() + " url is " + actualUrl); //+ " equals is " + imageView.getTag().equals(actualUrl) + " the other thing is " + (imageView.getTag() == null));
ImageLoader.getInstance().displayImage(actualUrl, imageView, contributionDisplayOptions);
imageView.setTag(actualUrl);
}
titleView.setText(Utils.displayTitleFromTitle(contribution.getFilename()));
switch(contribution.getState()) {
case Contribution.STATE_COMPLETED:
Date uploaded = contribution.getDateUploaded();
stateView.setText(SimpleDateFormat.getDateInstance().format(uploaded));
break;
case Contribution.STATE_QUEUED:
stateView.setText(R.string.contribution_state_queued);
break;
case Contribution.STATE_IN_PROGRESS:
stateView.setText(R.string.contribution_state_starting);
long total = contribution.getDataLength();
long transferred = contribution.getTransferred();
String stateString = String.format(getString(R.string.contribution_state_in_progress), (int)(((double)transferred / (double)total) * 100));
stateView.setText(stateString);
break;
case Contribution.STATE_FAILED:
stateView.setText(R.string.contribution_state_failed);
break;
}
}
}
@Override
protected void onDestroy() {
@ -124,12 +56,6 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
unbindService(uploadServiceConnection);
}
private GridView contributionsList;
private ContributionAdapter contributionsAdapter;
private DisplayImageOptions contributionDisplayOptions;
private String CONTRIBUTION_SELECTION = "";
/*
This sorts in the following order:
@ -156,34 +82,16 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
protected void onAuthCookieAcquired(String authCookie) {
// Do a sync everytime we get here!
ContentResolver.requestSync(((CommonsApplication)getApplicationContext()).getCurrentAccount(), ContributionsContentProvider.AUTHORITY, new Bundle());
contributionDisplayOptions = new DisplayImageOptions.Builder().cacheInMemory()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.displayer(new FadeInBitmapDisplayer(300))
.cacheInMemory()
.cacheOnDisc()
.resetViewBeforeLoading().build();
Intent uploadServiceIntent = new Intent(this, UploadService.class);
uploadServiceIntent.setAction(UploadService.ACTION_START_SERVICE);
startService(uploadServiceIntent);
bindService(uploadServiceIntent, uploadServiceConnection, Context.BIND_AUTO_CREATE);
Cursor allContributions = getContentResolver().query(ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT);
contributionsAdapter = new ContributionAdapter(this, allContributions, 0);
contributionsList.setAdapter(contributionsAdapter);
allContributions = getContentResolver().query(ContributionsContentProvider.BASE_URI, Contribution.Table.ALL_FIELDS, CONTRIBUTION_SELECTION, null, CONTRIBUTION_SORT);
getSupportLoaderManager().initLoader(0, null, this);
contributionsList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long item) {
Cursor cursor = (Cursor)adapterView.getItemAtPosition(position);
Contribution c = Contribution.fromCursor(cursor);
if(c.getState() == Contribution.STATE_FAILED) {
uploadService.queue(UploadService.ACTION_UPLOAD_FILE, c);
Log.d("Commons", "Restarting for" + c.toContentValues().toString());
}
Log.d("Commons", "You clicked on:" + c.toContentValues().toString());
}
});
}
@Override
@ -191,7 +99,8 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
super.onCreate(savedInstanceState);
setTitle(R.string.title_activity_contributions);
setContentView(R.layout.activity_contributions);
contributionsList = (GridView)findViewById(R.id.contributionsList);
contributionsList = (ContributionsListFragment)getSupportFragmentManager().findFragmentById(R.id.contributionsListFragment);
requestAuthToken();
}
@ -286,6 +195,16 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
}
}
public void onItemClick(AdapterView<?> adapterView, View view, int position, long item) {
Cursor cursor = (Cursor)adapterView.getItemAtPosition(position);
Contribution c = Contribution.fromCursor(cursor);
if(c.getState() == Contribution.STATE_FAILED) {
uploadService.queue(UploadService.ACTION_UPLOAD_FILE, c);
Log.d("Commons", "Restarting for" + c.toContentValues().toString());
}
Log.d("Commons", "You clicked on:" + c.toContentValues().toString());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.activity_contributions, menu);
@ -297,11 +216,12 @@ public class ContributionsActivity extends AuthenticatedActivity implements Load
}
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
contributionsAdapter.swapCursor(cursor);
allContributions = cursor;
contributionsList.setCursor(cursor);
}
public void onLoaderReset(Loader<Cursor> cursorLoader) {
contributionsAdapter.swapCursor(null);
contributionsList.setCursor(null);
}
}

View file

@ -0,0 +1,122 @@
package org.wikimedia.commons.contributions;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.CursorAdapter;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
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.R;
import org.wikimedia.commons.UploadService;
import org.wikimedia.commons.Utils;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ContributionsListFragment extends SherlockFragment {
private GridView contributionsList;
private ContributionsListAdapter contributionsAdapter;
private DisplayImageOptions contributionDisplayOptions;
private Cursor allContributions;
private class ContributionsListAdapter extends CursorAdapter {
public ContributionsListAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return getActivity().getLayoutInflater().inflate(R.layout.layout_contribution, viewGroup, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView imageView = (ImageView)view.findViewById(R.id.contributionImage);
TextView titleView = (TextView)view.findViewById(R.id.contributionTitle);
TextView stateView = (TextView)view.findViewById(R.id.contributionState);
Contribution contribution = Contribution.fromCursor(cursor);
String actualUrl = TextUtils.isEmpty(contribution.getImageUrl()) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(320);
Log.d("Commons", "Trying URL " + actualUrl);
Log.d("Commons", "For " + contribution.toContentValues());
if(imageView.getTag() == null || !imageView.getTag().equals(actualUrl)) {
Log.d("Commons", "Tag is " + imageView.getTag() + " url is " + actualUrl); //+ " equals is " + imageView.getTag().equals(actualUrl) + " the other thing is " + (imageView.getTag() == null));
ImageLoader.getInstance().displayImage(actualUrl, imageView, contributionDisplayOptions);
imageView.setTag(actualUrl);
}
titleView.setText(Utils.displayTitleFromTitle(contribution.getFilename()));
switch(contribution.getState()) {
case Contribution.STATE_COMPLETED:
Date uploaded = contribution.getDateUploaded();
stateView.setText(SimpleDateFormat.getDateInstance().format(uploaded));
break;
case Contribution.STATE_QUEUED:
stateView.setText(R.string.contribution_state_queued);
break;
case Contribution.STATE_IN_PROGRESS:
stateView.setText(R.string.contribution_state_starting);
long total = contribution.getDataLength();
long transferred = contribution.getTransferred();
String stateString = String.format(getString(R.string.contribution_state_in_progress), (int)(((double)transferred / (double)total) * 100));
stateView.setText(stateString);
break;
case Contribution.STATE_FAILED:
stateView.setText(R.string.contribution_state_failed);
break;
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_contributions, container, false);
}
public void setCursor(Cursor cursor) {
if(allContributions == null) {
contributionsAdapter = new ContributionsListAdapter(this.getActivity(), cursor, 0);
contributionsList.setAdapter(contributionsAdapter);
}
allContributions = cursor;
contributionsAdapter.swapCursor(cursor);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
contributionsList = (GridView)getView().findViewById(R.id.contributionsList);
contributionDisplayOptions = new DisplayImageOptions.Builder().cacheInMemory()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.displayer(new FadeInBitmapDisplayer(300))
.cacheInMemory()
.cacheOnDisc()
.resetViewBeforeLoading().build();
contributionsList.setOnItemClickListener((AdapterView.OnItemClickListener)getActivity());
}
}