From 9175eaed95336047df43bc6c727e4dca4b1ecdd7 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Sat, 13 Oct 2012 03:41:13 +0530 Subject: [PATCH] Upload properly from the background. Push out notification Also update java-mwapi to support progress callbacks --- libs/java-mwapi.jar | Bin 742677 -> 746589 bytes res/layout/layout_upload_progress.xml | 35 ++++ res/values-v9/styles.xml | 7 + res/values/styles.xml | 11 +- src/org/wikimedia/commons/ShareActivity.java | 29 +-- src/org/wikimedia/commons/UploadService.java | 191 +++++++++---------- 6 files changed, 150 insertions(+), 123 deletions(-) create mode 100644 res/layout/layout_upload_progress.xml create mode 100644 res/values-v9/styles.xml diff --git a/libs/java-mwapi.jar b/libs/java-mwapi.jar index 7ee33ad874b05858ceadf6bf822d0a8a49d5106a..d45f78f5b9f331d461b55092403b585b7fc5e1bf 100644 GIT binary patch delta 19222 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 fAY(|6iH-~nIZECOmzSk^@RKKr;FlUWdnf delta 15462 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 E2P|_)+5i9m diff --git a/res/layout/layout_upload_progress.xml b/res/layout/layout_upload_progress.xml new file mode 100644 index 000000000..b6568db02 --- /dev/null +++ b/res/layout/layout_upload_progress.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-v9/styles.xml b/res/values-v9/styles.xml new file mode 100644 index 000000000..a4c9d25b9 --- /dev/null +++ b/res/values-v9/styles.xml @@ -0,0 +1,7 @@ + + + - + + + + + \ No newline at end of file diff --git a/src/org/wikimedia/commons/ShareActivity.java b/src/org/wikimedia/commons/ShareActivity.java index 948cd8f84..b60cbd3e6 100644 --- a/src/org/wikimedia/commons/ShareActivity.java +++ b/src/org/wikimedia/commons/ShareActivity.java @@ -4,7 +4,6 @@ import java.io.*; import org.mediawiki.api.ApiResult; import org.mediawiki.api.MWApi; -import org.wikimedia.commons.UploadService.UploadBinder; import android.net.Uri; import android.os.AsyncTask; @@ -49,8 +48,6 @@ public class ShareActivity extends Activity { Intent intent = getIntent(); - final Activity that = this; - if(intent.getAction().equals(Intent.ACTION_SEND)) { if(intent.getType().startsWith("image/")) { ImageLoaderTask loader = new ImageLoaderTask(backgroundImageView); @@ -60,31 +57,19 @@ public class ShareActivity extends Activity { uploadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Log.d("Commons", "Starting upload, yo!"); - ServiceConnection connection = new ServiceConnection() { - - @Override - public void onServiceDisconnected(ComponentName name) { - } - - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - Log.d("Commons", "Service connected!"); - UploadService uploadService = ((UploadService.UploadBinder)service).getService(); - uploadService.doUpload(app.getApi(), imageUri, titleEdit.getText().toString(), - descEdit.getText().toString(), "Mobile Upload represent!" ); - that.finish(); - } - }; - that.bindService(new Intent(that, UploadService.class), connection, Context.BIND_AUTO_CREATE); - Log.d("Commons", "Service requeseted"); + Intent uploadIntent = new Intent(getApplicationContext(), UploadService.class); + uploadIntent.putExtra(UploadService.EXTRA_MEDIA_URI, imageUri); + uploadIntent.putExtra(UploadService.EXTRA_TARGET_FILENAME, titleEdit.getText().toString()); + uploadIntent.putExtra(UploadService.EXTRA_PAGE_CONTENT, descEdit.getText().toString()); + uploadIntent.putExtra(UploadService.EXTRA_EDIT_SUMMARY, "Mobile upload from Wikimedia Commons Android app"); + startService(uploadIntent); + finish(); } }); } } } - @Override protected void onResume() { super.onResume(); diff --git a/src/org/wikimedia/commons/UploadService.java b/src/org/wikimedia/commons/UploadService.java index 52fb7efec..b64704ccb 100644 --- a/src/org/wikimedia/commons/UploadService.java +++ b/src/org/wikimedia/commons/UploadService.java @@ -4,118 +4,109 @@ import java.io.*; import org.mediawiki.api.*; +import de.mastacode.http.ProgressListener; + import android.app.*; import android.content.*; import android.os.*; import android.support.v4.app.NotificationCompat; import android.util.Log; +import android.widget.RemoteViews; import android.widget.Toast; import android.net.*; -public class UploadService extends Service { +public class UploadService extends IntentService { + private static final String EXTRA_PREFIX = "org.wikimedia.commons.uploader"; + public static final String EXTRA_MEDIA_URI = EXTRA_PREFIX + ".media_uri"; + public static final String EXTRA_TARGET_FILENAME = EXTRA_PREFIX + ".filename"; + public static final String EXTRA_PAGE_CONTENT = EXTRA_PREFIX + ".content"; + public static final String EXTRA_EDIT_SUMMARY = EXTRA_PREFIX + ".summary"; + + private NotificationManager notificationManager; + public UploadService(String name) { + super(name); + } + + public UploadService() { + super("UploadService"); + } public static final int NOTIFICATION_DOWNLOAD_IN_PROGRESS = 1; - class UploadImageTask extends AsyncTask { - MWApi api; - Context context; - NotificationManager notificationsManager; + private class NotificationUpdateProgressListener implements ProgressListener { + + Notification curNotification; + public NotificationUpdateProgressListener(Notification curNotification) { + Log.d("Commons", "Fuckity"); + this.curNotification = curNotification; + } + @Override + public void onProgress(long transferred, long total) { + double percent = transferred/total * 100; + Log.d("Commons", "Uploaded " + percent + "% (" + transferred + " of " + total + ")"); + curNotification.contentView.setProgressBar(R.id.uploadNotificationProgress, 100, (int)percent, false); + notificationManager.notify(NOTIFICATION_DOWNLOAD_IN_PROGRESS, curNotification); + } + + } + @Override + public void onDestroy() { + super.onDestroy(); + Log.d("Commons", "ZOMG I AM BEING KILLED HALP!"); + } + + @Override + public void onCreate() { + super.onCreate(); + notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); + } + + @Override + protected void onHandleIntent(Intent intent) { + MWApi api = ((CommonsApplication)this.getApplicationContext()).getApi(); + InputStream file; + ApiResult result; + RemoteViews notificationView; - private Notification curNotification; - - @Override - protected String doInBackground(String... params) { - Uri imageUri = Uri.parse(params[0]); - String filename = params[1]; - String text = params[2]; - String comment = params[3]; + Bundle extras = intent.getExtras(); + Uri mediaUri = (Uri)extras.getParcelable(EXTRA_MEDIA_URI); + String filename = intent.getStringExtra(EXTRA_TARGET_FILENAME); + String pageContents = intent.getStringExtra(EXTRA_PAGE_CONTENT); + String editSummary = intent.getStringExtra(EXTRA_EDIT_SUMMARY); + + try { + file = this.getContentResolver().openInputStream(mediaUri); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } - InputStream file; - - try { - file = context.getContentResolver().openInputStream(imageUri); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - - try { - ApiResult result = api.upload(filename, file, text, comment); - -// Document document = (Document)result.getDocument(); -// StringWriter wr = new StringWriter(); -// try { -// Transformer trans = TransformerFactory.newInstance().newTransformer(); -// trans.transform(new DOMSource(result.getDocument()), new StreamResult(wr)); -// String res = wr.toString(); -// return res; -// } catch (Exception e) { -// e.printStackTrace(); -// //FUCK YOU YOU SON OF A LEMON PARTY -// } - - return result.getString("/api/upload/@result"); - } catch (IOException e) { - e.printStackTrace(); - return "Failure"; - } - } - - UploadImageTask(MWApi api, Context context, NotificationManager notificationManager) { - this.api = api; - this.context = context; - this.notificationsManager = notificationManager; - } - - @Override - protected void onPostExecute(String result) { - Log.d("Commons", "Done!"); - super.onPostExecute(result); - if(result.equals("Success")) { - Toast successToast = Toast.makeText(context, R.string.uploading_success, Toast.LENGTH_LONG); - successToast.show(); - } else { - Toast failureToast = Toast.makeText(context, R.string.uploading_failed, Toast.LENGTH_LONG); - failureToast.show(); - } - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - Toast startingToast = Toast.makeText(context, R.string.uploading_started, Toast.LENGTH_LONG); - startingToast.show(); - Log.d("Commons", "Before execution!"); -// curNotification = new NotificationCompat.Builder(context).setAutoCancel(true) -// .setContentTitle("Starting Upload!") -// .setContentText("Uploading!") -// .setSmallIcon(R.drawable.ic_launcher) -// .setAutoCancel(true) -// .getNotification(); -// -// notificationsManager.notify(NOTIFICATION_DOWNLOAD_IN_PROGRESS, curNotification); - } - - - } - public class UploadBinder extends Binder { - UploadService getService() { - return UploadService.this; - } - } - - final UploadBinder uploadBinder = new UploadBinder(); - @Override - public IBinder onBind(Intent intent) { - return uploadBinder; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - return Service.START_NOT_STICKY; - } - - public void doUpload(MWApi api, Uri imageUri, String filename, String description, String editSummary) { - UploadImageTask uploadImage = new UploadImageTask(api, this, (NotificationManager)getSystemService(NOTIFICATION_SERVICE)); - uploadImage.execute(imageUri.toString(), filename, description, editSummary); + notificationView = new RemoteViews(getPackageName(), R.layout.layout_upload_progress); + notificationView.setTextViewText(R.id.uploadNotificationTitle, "Uploading " + filename); + + Log.d("Commons", "Before execution!"); + Notification curNotification = new NotificationCompat.Builder(this).setAutoCancel(true) + .setSmallIcon(R.drawable.ic_launcher) + .setAutoCancel(true) + .setContent(notificationView) + .setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0)) + .getNotification(); + + notificationManager.notify(NOTIFICATION_DOWNLOAD_IN_PROGRESS, curNotification); + + Toast startingToast = Toast.makeText(this, R.string.uploading_started, Toast.LENGTH_LONG); + startingToast.show(); + Log.d("Commons", "Just before"); + try { + result = api.upload(filename, file, pageContents, editSummary, new NotificationUpdateProgressListener(curNotification)); + } catch (IOException e) { + // Do error handling! + Log.d("Commons", "Fuck"); + e.printStackTrace(); + throw new RuntimeException(e); + } + + Log.d("Commons", "After"); + notificationView.setTextViewText(R.id.uploadNotificationTitle, filename + " Uploaded!"); + notificationManager.notify(NOTIFICATION_DOWNLOAD_IN_PROGRESS, curNotification); } }