Brion VIBBER has submitted this change and it was merged. Change subject: Split up contributions related code into separate classes ......................................................................
Split up contributions related code into separate classes A controller introduced to deal with common code for picking images from the gallery or camera. We should probably start using similar controller methods elsewhere. Splitting this particular one up because I'll be using it elsewhere GitHub: https://github.com/wikimedia/apps-android-commons/pull/39 Change-Id: Idc393414be921d9a0fd54fcb3e2dcd676d8cc08b --- A commons/src/main/java/org/wikimedia/commons/contributions/ContributionController.java A commons/src/main/java/org/wikimedia/commons/contributions/ContributionViewHolder.java A commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListAdapter.java M commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java 4 files changed, 237 insertions(+), 180 deletions(-) Approvals: Brion VIBBER: Verified; Looks good to me, approved diff --git a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionController.java b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionController.java new file mode 100644 index 0000000..f6beac4 --- /dev/null +++ b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionController.java @@ -0,0 +1,96 @@ +package org.wikimedia.commons.contributions; + +import android.app.*; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.util.Log; +import com.actionbarsherlock.app.SherlockFragment; +import org.wikimedia.commons.upload.ShareActivity; +import org.wikimedia.commons.upload.UploadService; + +import java.io.File; +import java.io.IOException; +import java.util.Date; + +public class ContributionController { + private SherlockFragment fragment; + private Activity activity; + + private final static int SELECT_FROM_GALLERY = 1; + private final static int SELECT_FROM_CAMERA = 2; + + public ContributionController(SherlockFragment fragment) { + this.fragment = fragment; + this.activity = fragment.getActivity(); + } + + // See http://stackoverflow.com/a/5054673/17865 for why this is done + private Uri lastGeneratedCaptureURI; + + private Uri reGenerateImageCaptureURI() { + String storageState = Environment.getExternalStorageState(); + if(storageState.equals(Environment.MEDIA_MOUNTED)) { + + String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Commons/images/" + new Date().getTime() + ".jpg"; + File _photoFile = new File(path); + try { + if(_photoFile.exists() == false) { + _photoFile.getParentFile().mkdirs(); + _photoFile.createNewFile(); + } + + } catch (IOException e) { + Log.e("Commons", "Could not create file: " + path, e); + } + + return Uri.fromFile(_photoFile); + } else { + throw new RuntimeException("No external storage found!"); + } + } + + public void startCameraCapture() { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + lastGeneratedCaptureURI = reGenerateImageCaptureURI(); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, lastGeneratedCaptureURI); + fragment.startActivityForResult(takePictureIntent, SELECT_FROM_CAMERA); + } + + public void startGalleryPick() { + Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT); + pickImageIntent.setType("image/*"); + fragment.startActivityForResult(pickImageIntent, SELECT_FROM_GALLERY); + } + + public void handleImagePicked(int requestCode, Intent data) { + Intent shareIntent = new Intent(activity, ShareActivity.class); + shareIntent.setAction(Intent.ACTION_SEND); + switch(requestCode) { + case SELECT_FROM_GALLERY: + shareIntent.setType(activity.getContentResolver().getType(data.getData())); + shareIntent.putExtra(Intent.EXTRA_STREAM, data.getData()); + shareIntent.putExtra(UploadService.EXTRA_SOURCE, Contribution.SOURCE_GALLERY); + break; + case SELECT_FROM_CAMERA: + shareIntent.setType("image/jpeg"); //FIXME: Find out appropriate mime type + shareIntent.putExtra(Intent.EXTRA_STREAM, lastGeneratedCaptureURI); + shareIntent.putExtra(UploadService.EXTRA_SOURCE, Contribution.SOURCE_CAMERA); + break; + } + activity.startActivity(shareIntent); + } + + public void saveState(Bundle outState) { + outState.putParcelable("lastGeneratedCaptureURI", lastGeneratedCaptureURI); + } + + public void loadState(Bundle savedInstanceState) { + if(savedInstanceState != null) { + lastGeneratedCaptureURI = (Uri) savedInstanceState.getParcelable("lastGeneratedCaptureURI"); + } + } + +} diff --git a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionViewHolder.java b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionViewHolder.java new file mode 100644 index 0000000..bfa9bda --- /dev/null +++ b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionViewHolder.java @@ -0,0 +1,25 @@ +package org.wikimedia.commons.contributions; + +import android.view.View; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; +import org.wikimedia.commons.R; + +class ContributionViewHolder { + final ImageView imageView; + final TextView titleView; + final TextView stateView; + final TextView seqNumView; + final ProgressBar progressView; + + String url; + + ContributionViewHolder(View parent) { + imageView = (ImageView)parent.findViewById(R.id.contributionImage); + titleView = (TextView)parent.findViewById(R.id.contributionTitle); + stateView = (TextView)parent.findViewById(R.id.contributionState); + seqNumView = (TextView)parent.findViewById(R.id.contributionSequenceNumber); + progressView = (ProgressBar)parent.findViewById(R.id.contributionProgress); + } +} diff --git a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListAdapter.java b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListAdapter.java new file mode 100644 index 0000000..295f256 --- /dev/null +++ b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListAdapter.java @@ -0,0 +1,106 @@ +package org.wikimedia.commons.contributions; + +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.support.v4.widget.CursorAdapter; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewGroup; +import com.actionbarsherlock.app.SherlockFragment; +import com.nostra13.universalimageloader.core.DisplayImageOptions; +import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; +import org.wikimedia.commons.CommonsApplication; +import org.wikimedia.commons.MediaWikiImageView; +import org.wikimedia.commons.R; +import org.wikimedia.commons.Utils; + +class ContributionsListAdapter extends CursorAdapter { + + private DisplayImageOptions contributionDisplayOptions = Utils.getGenericDisplayOptions().build();; + private SherlockFragment fragment; + + public ContributionsListAdapter(SherlockFragment fragment, Cursor c, int flags) { + super(fragment.getActivity(), c, flags); + this.fragment = fragment; + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup viewGroup) { + View parent = fragment.getActivity().getLayoutInflater().inflate(R.layout.layout_contribution, viewGroup, false); + parent.setTag(new ContributionViewHolder(parent)); + return parent; + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + final ContributionViewHolder views = (ContributionViewHolder)view.getTag(); + Contribution contribution = Contribution.fromCursor(cursor); + + String actualUrl = TextUtils.isEmpty(contribution.getImageUrl()) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(320); + + if(views.url == null || !views.url.equals(actualUrl)) { + if(actualUrl.startsWith("http")) { + MediaWikiImageView mwImageView = (MediaWikiImageView)views.imageView; + mwImageView.setMedia(contribution, ((CommonsApplication) fragment.getActivity().getApplicationContext()).getImageLoader()); + // FIXME: For transparent images + } else { + com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(actualUrl, views.imageView, contributionDisplayOptions, new SimpleImageLoadingListener() { + + @Override + public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { + if(loadedImage.hasAlpha()) { + views.imageView.setBackgroundResource(android.R.color.white); + } + views.seqNumView.setVisibility(View.GONE); + } + + }); + } + views.url = actualUrl; + } + + BitmapDrawable actualImageDrawable = (BitmapDrawable)views.imageView.getDrawable(); + if(actualImageDrawable != null && actualImageDrawable.getBitmap() != null && actualImageDrawable.getBitmap().hasAlpha()) { + views.imageView.setBackgroundResource(android.R.color.white); + } else { + views.imageView.setBackgroundDrawable(null); + } + + views.titleView.setText(contribution.getDisplayTitle()); + + views.seqNumView.setText(String.valueOf(cursor.getPosition() + 1)); + views.seqNumView.setVisibility(View.VISIBLE); + + switch(contribution.getState()) { + case Contribution.STATE_COMPLETED: + views.stateView.setVisibility(View.GONE); + views.progressView.setVisibility(View.GONE); + views.stateView.setText(""); + break; + case Contribution.STATE_QUEUED: + views.stateView.setVisibility(View.VISIBLE); + views.progressView.setVisibility(View.GONE); + views.stateView.setText(R.string.contribution_state_queued); + break; + case Contribution.STATE_IN_PROGRESS: + views.stateView.setVisibility(View.GONE); + views.progressView.setVisibility(View.VISIBLE); + long total = contribution.getDataLength(); + long transferred = contribution.getTransferred(); + if(transferred == 0 || transferred >= total) { + views.progressView.setIndeterminate(true); + } else { + views.progressView.setProgress((int)(((double)transferred / (double)total) * 100)); + } + break; + case Contribution.STATE_FAILED: + views.stateView.setVisibility(View.VISIBLE); + views.stateView.setText(R.string.contribution_state_failed); + views.progressView.setVisibility(View.GONE); + break; + } + + } +} diff --git a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java index e8caa90..065f790 100644 --- a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java +++ b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java @@ -5,14 +5,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; import android.os.Bundle; -import android.os.Environment; -import android.provider.MediaStore; -import android.support.v4.widget.CursorAdapter; -import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -25,20 +18,11 @@ import com.nostra13.universalimageloader.core.DisplayImageOptions; -import java.io.*; -import java.util.*; - -import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener; import org.wikimedia.commons.*; import org.wikimedia.commons.R; -import org.wikimedia.commons.upload.ShareActivity; -import org.wikimedia.commons.upload.UploadService; public class ContributionsListFragment extends SherlockFragment { - - private final static int SELECT_FROM_GALLERY = 1; - private final static int SELECT_FROM_CAMERA = 2; private GridView contributionsList; private TextView waitingMessage; @@ -46,114 +30,9 @@ private ContributionsListAdapter contributionsAdapter; - private DisplayImageOptions contributionDisplayOptions; private Cursor allContributions; - private static class ContributionViewHolder { - final ImageView imageView; - final TextView titleView; - final TextView stateView; - final TextView seqNumView; - final ProgressBar progressView; - - String url; - - ContributionViewHolder(View parent) { - imageView = (ImageView)parent.findViewById(R.id.contributionImage); - titleView = (TextView)parent.findViewById(R.id.contributionTitle); - stateView = (TextView)parent.findViewById(R.id.contributionState); - seqNumView = (TextView)parent.findViewById(R.id.contributionSequenceNumber); - progressView = (ProgressBar)parent.findViewById(R.id.contributionProgress); - } - } - - 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) { - View parent = getActivity().getLayoutInflater().inflate(R.layout.layout_contribution, viewGroup, false); - parent.setTag(new ContributionViewHolder(parent)); - return parent; - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - // hack: hide the 'first sync' message once we've loaded a cell - clearSyncMessage(); - - final ContributionViewHolder views = (ContributionViewHolder)view.getTag(); - Contribution contribution = Contribution.fromCursor(cursor); - - String actualUrl = TextUtils.isEmpty(contribution.getImageUrl()) ? contribution.getLocalUri().toString() : contribution.getThumbnailUrl(320); - - if(views.url == null || !views.url.equals(actualUrl)) { - if(actualUrl.startsWith("http")) { - MediaWikiImageView mwImageView = (MediaWikiImageView)views.imageView; - mwImageView.setMedia(contribution, ((CommonsApplication) getActivity().getApplicationContext()).getImageLoader()); - // FIXME: For transparent images - } else { - com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(actualUrl, views.imageView, contributionDisplayOptions, new SimpleImageLoadingListener() { - - @Override - public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { - if(loadedImage.hasAlpha()) { - views.imageView.setBackgroundResource(android.R.color.white); - } - views.seqNumView.setVisibility(View.GONE); - } - - }); - } - views.url = actualUrl; - } - - BitmapDrawable actualImageDrawable = (BitmapDrawable)views.imageView.getDrawable(); - if(actualImageDrawable != null && actualImageDrawable.getBitmap() != null && actualImageDrawable.getBitmap().hasAlpha()) { - views.imageView.setBackgroundResource(android.R.color.white); - } else { - views.imageView.setBackgroundDrawable(null); - } - - views.titleView.setText(contribution.getDisplayTitle()); - - views.seqNumView.setText(String.valueOf(cursor.getPosition() + 1)); - views.seqNumView.setVisibility(View.VISIBLE); - - switch(contribution.getState()) { - case Contribution.STATE_COMPLETED: - views.stateView.setVisibility(View.GONE); - views.progressView.setVisibility(View.GONE); - views.stateView.setText(""); - break; - case Contribution.STATE_QUEUED: - views.stateView.setVisibility(View.VISIBLE); - views.progressView.setVisibility(View.GONE); - views.stateView.setText(R.string.contribution_state_queued); - break; - case Contribution.STATE_IN_PROGRESS: - views.stateView.setVisibility(View.GONE); - views.progressView.setVisibility(View.VISIBLE); - long total = contribution.getDataLength(); - long transferred = contribution.getTransferred(); - if(transferred == 0 || transferred >= total) { - views.progressView.setIndeterminate(true); - } else { - views.progressView.setProgress((int)(((double)transferred / (double)total) * 100)); - } - break; - case Contribution.STATE_FAILED: - views.stateView.setVisibility(View.VISIBLE); - views.stateView.setText(R.string.contribution_state_failed); - views.progressView.setVisibility(View.GONE); - break; - } - - } - } + private ContributionController controller; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -162,7 +41,7 @@ public void setCursor(Cursor cursor) { if(allContributions == null) { - contributionsAdapter = new ContributionsListAdapter(this.getActivity(), cursor, 0); + contributionsAdapter = new ContributionsListAdapter(this, cursor, 0); contributionsList.setAdapter(contributionsAdapter); } allContributions = cursor; @@ -172,77 +51,27 @@ @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); + controller.saveState(outState); outState.putInt("grid-position", contributionsList.getFirstVisiblePosition()); - outState.putParcelable("lastGeneratedCaptureURI", lastGeneratedCaptureURI); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - switch(requestCode) { - case SELECT_FROM_GALLERY: - if(resultCode == Activity.RESULT_OK) { - Intent shareIntent = new Intent(getActivity(), ShareActivity.class); - shareIntent.setAction(Intent.ACTION_SEND); - - shareIntent.setType(getActivity().getContentResolver().getType(data.getData())); - shareIntent.putExtra(Intent.EXTRA_STREAM, data.getData()); - shareIntent.putExtra(UploadService.EXTRA_SOURCE, Contribution.SOURCE_GALLERY); - startActivity(shareIntent); - } - break; - case SELECT_FROM_CAMERA: - if(resultCode == Activity.RESULT_OK) { - Intent shareIntent = new Intent(getActivity(), ShareActivity.class); - shareIntent.setAction(Intent.ACTION_SEND); - Log.d("Commons", "Uri is " + lastGeneratedCaptureURI); - shareIntent.setType("image/jpeg"); //FIXME: Find out appropriate mime type - shareIntent.putExtra(Intent.EXTRA_STREAM, lastGeneratedCaptureURI); - shareIntent.putExtra(UploadService.EXTRA_SOURCE, Contribution.SOURCE_CAMERA); - startActivity(shareIntent); - } - break; + if(resultCode == Activity.RESULT_OK) { + controller.handleImagePicked(requestCode, data); } } - // See http://stackoverflow.com/a/5054673/17865 for why this is done - private Uri lastGeneratedCaptureURI; - - private void reGenerateImageCaptureURI() { - String storageState = Environment.getExternalStorageState(); - if(storageState.equals(Environment.MEDIA_MOUNTED)) { - - String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Commons/images/" + new Date().getTime() + ".jpg"; - File _photoFile = new File(path); - try { - if(_photoFile.exists() == false) { - _photoFile.getParentFile().mkdirs(); - _photoFile.createNewFile(); - } - - } catch (IOException e) { - Log.e("Commons", "Could not create file: " + path, e); - } - - lastGeneratedCaptureURI = Uri.fromFile(_photoFile); - } else { - throw new RuntimeException("No external storage found!"); - } - } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.menu_from_gallery: - Intent pickImageIntent = new Intent(Intent.ACTION_GET_CONTENT); - pickImageIntent.setType("image/*"); - startActivityForResult(pickImageIntent, SELECT_FROM_GALLERY); + controller.startGalleryPick(); return true; case R.id.menu_from_camera: - Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - reGenerateImageCaptureURI(); - takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, lastGeneratedCaptureURI); - startActivityForResult(takePictureIntent, SELECT_FROM_CAMERA); + controller.startCameraCapture(); return true; case R.id.menu_settings: Intent settingsIntent = new Intent(getActivity(), SettingsActivity.class); @@ -286,15 +115,16 @@ public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + controller = new ContributionController(this); + controller.loadState(savedInstanceState); + contributionsList = (GridView)getView().findViewById(R.id.contributionsList); waitingMessage = (TextView)getView().findViewById(R.id.waitingMessage); emptyMessage = (TextView)getView().findViewById(R.id.waitingMessage); - contributionDisplayOptions = Utils.getGenericDisplayOptions().build(); contributionsList.setOnItemClickListener((AdapterView.OnItemClickListener)getActivity()); if(savedInstanceState != null) { Log.d("Commons", "Scrolling to " + savedInstanceState.getInt("grid-position")); - lastGeneratedCaptureURI = (Uri) savedInstanceState.getParcelable("lastGeneratedCaptureURI"); contributionsList.setSelection(savedInstanceState.getInt("grid-position")); } -- To view, visit https://gerrit.wikimedia.org/r/76000 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Idc393414be921d9a0fd54fcb3e2dcd676d8cc08b Gerrit-PatchSet: 2 Gerrit-Project: apps/android/commons Gerrit-Branch: campaigns Gerrit-Owner: Yuvipanda <[email protected]> Gerrit-Reviewer: Brion VIBBER <[email protected]> Gerrit-Reviewer: Yuvipanda <[email protected]> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
