SuchABot has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/75995


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, 245 insertions(+), 182 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/commons 
refs/changes/95/75995/1

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..1fff28b
--- /dev/null
+++ 
b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionController.java
@@ -0,0 +1,105 @@
+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, int resultCode, Intent 
data) {
+        switch(requestCode) {
+            case SELECT_FROM_GALLERY:
+                if(resultCode == Activity.RESULT_OK) {
+                    Intent shareIntent = new Intent(activity, 
ShareActivity.class);
+                    shareIntent.setAction(Intent.ACTION_SEND);
+
+                    
shareIntent.setType(activity.getContentResolver().getType(data.getData()));
+                    shareIntent.putExtra(Intent.EXTRA_STREAM, data.getData());
+                    shareIntent.putExtra(UploadService.EXTRA_SOURCE, 
Contribution.SOURCE_GALLERY);
+                    activity.startActivity(shareIntent);
+                }
+                break;
+            case SELECT_FROM_CAMERA:
+                if(resultCode == Activity.RESULT_OK) {
+                    Intent shareIntent = new Intent(activity, 
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);
+                    activity.startActivity(shareIntent);
+                }
+                break;
+        }
+    }
+
+    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..ed02369 100644
--- 
a/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java
+++ 
b/commons/src/main/java/org/wikimedia/commons/contributions/ContributionsListFragment.java
@@ -1,18 +1,10 @@
 package org.wikimedia.commons.contributions;
 
-import android.app.Activity;
 import android.content.Context;
 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 +17,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 +29,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 +40,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 +50,25 @@
     @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;
-        }
+        controller.handleImagePicked(requestCode, resultCode, 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 +112,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/75995
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Idc393414be921d9a0fd54fcb3e2dcd676d8cc08b
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/commons
Gerrit-Branch: master
Gerrit-Owner: SuchABot <[email protected]>
Gerrit-Reviewer: Yuvipanda <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to