From: David A. Velasco Date: Tue, 3 Jun 2014 12:50:48 +0000 (+0200) Subject: Merge pull request #508 from owncloud/vanish_notifications X-Git-Tag: oc-android-1.7.0_signed~294 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/cc7366348d0e3fc469297d6605a33a54cbe7a98c?hp=0a1447e866377773af2661ffdd0affb73e71547e Merge pull request #508 from owncloud/vanish_notifications Vanish succesful notifications --- diff --git a/src/com/owncloud/android/files/services/FileDownloader.java b/src/com/owncloud/android/files/services/FileDownloader.java index 7a031359..80d4a6dc 100644 --- a/src/com/owncloud/android/files/services/FileDownloader.java +++ b/src/com/owncloud/android/files/services/FileDownloader.java @@ -36,6 +36,8 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.OwnCloudClientFactory; import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.notifications.NotificationBuilderWithProgressBar; +import com.owncloud.android.notifications.NotificationDelayer; import com.owncloud.android.operations.DownloadFileOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; @@ -46,7 +48,6 @@ import com.owncloud.android.ui.preview.PreviewImageActivity; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.Log_OC; -import com.owncloud.android.utils.NotificationBuilderWithProgressBar; import android.accounts.Account; import android.accounts.AccountsException; @@ -494,29 +495,25 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis mDownloadClient = null; // grant that future retries on the same account will get the fresh credentials } else { - Intent showDetailsIntent = null; - if (downloadResult.isSuccess()) { - if (PreviewImageFragment.canBePreviewed(download.getFile())) { - showDetailsIntent = new Intent(this, PreviewImageActivity.class); - } else { - showDetailsIntent = new Intent(this, FileDisplayActivity.class); - } - showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, download.getFile()); - showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, download.getAccount()); - showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - - } else { - // TODO put something smart in showDetailsIntent - showDetailsIntent = new Intent(); - } + // TODO put something smart in showDetailsIntent + Intent showDetailsIntent = new Intent(); mNotificationBuilder .setContentIntent(PendingIntent.getActivity( this, (int) System.currentTimeMillis(), showDetailsIntent, 0)); } mNotificationBuilder.setContentText(ErrorMessageAdapter.getErrorCauseMessage(downloadResult, download, getResources())); - mNotificationManager.notify(tickerId, mNotificationBuilder.build()); + + // Remove success notification + if (downloadResult.isSuccess()) { + // Sleep 2 seconds, so show the notification before remove it + NotificationDelayer.cancelWithDelay( + mNotificationManager, + R.string.downloader_download_succeeded_ticker, + 2000); + } + } } diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index c6408c28..e9d8d1b8 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -33,6 +33,8 @@ import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.db.DbHandler; +import com.owncloud.android.notifications.NotificationBuilderWithProgressBar; +import com.owncloud.android.notifications.NotificationDelayer; import com.owncloud.android.operations.CreateFolderOperation; import com.owncloud.android.lib.resources.files.RemoteFile; import com.owncloud.android.lib.common.operations.RemoteOperation; @@ -52,11 +54,8 @@ import com.owncloud.android.ui.activity.FailedUploadActivity; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.InstantUploadActivity; -import com.owncloud.android.ui.preview.PreviewImageActivity; -import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.Log_OC; -import com.owncloud.android.utils.NotificationBuilderWithProgressBar; import android.accounts.Account; import android.accounts.AccountManager; @@ -725,48 +724,15 @@ public class FileUploader extends Service implements OnDatatransferProgressListe */ private void notifyUploadResult(RemoteOperationResult uploadResult, UploadFileOperation upload) { Log_OC.d(TAG, "NotifyUploadResult with resultCode: " + uploadResult.getCode()); - if (uploadResult.isCancelled()) { - // / cancelled operation -> silent removal of progress notification - mNotificationManager.cancel(R.string.uploader_upload_in_progress_ticker); - - } else if (uploadResult.isSuccess()) { - // / success -> silent update of progress notification to success - // message - mNotificationBuilder - .setOngoing(false) - .setAutoCancel(true) - .setProgress(0, 0, false); - - /// includes a pending intent in the notification showing the details view of the file - Intent showDetailsIntent = null; - if (PreviewImageFragment.canBePreviewed(upload.getFile())) { - showDetailsIntent = new Intent(this, PreviewImageActivity.class); - } else { - showDetailsIntent = new Intent(this, FileDisplayActivity.class); - } - showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, upload.getFile()); - showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, upload.getAccount()); - showDetailsIntent.putExtra(FileActivity.EXTRA_FROM_NOTIFICATION, true);; - mNotificationBuilder - .setContentIntent(PendingIntent.getActivity( - this, (int) System.currentTimeMillis(), showDetailsIntent, 0 - )) - .setTicker(getString(R.string.uploader_upload_succeeded_ticker)) - .setContentTitle(getString(R.string.uploader_upload_succeeded_ticker)) - .setContentText(ErrorMessageAdapter.getErrorCauseMessage(uploadResult, upload, getResources())); - - mNotificationManager.notify(R.string.uploader_upload_in_progress_ticker, mNotificationBuilder.build()); // NOT - // AN - DbHandler db = new DbHandler(this.getBaseContext()); - db.removeIUPendingFile(mCurrentUpload.getOriginalStoragePath()); - db.close(); - - } else { - - // / fail -> explicit failure notification - mNotificationManager.cancel(R.string.uploader_upload_in_progress_ticker); + // / cancelled operation or success -> silent removal of progress notification + mNotificationManager.cancel(R.string.uploader_upload_in_progress_ticker); + + // Show the result: success or fail notification + if (!uploadResult.isCancelled()) { + int tickerId = (uploadResult.isSuccess()) ? R.string.uploader_upload_succeeded_ticker : + R.string.uploader_upload_failed_ticker; - NotificationCompat.Builder errorBuilder = new NotificationCompat.Builder(this); + NotificationCompat.Builder resultBuilder = new NotificationCompat.Builder(this); String content = null; @@ -774,10 +740,10 @@ public class FileUploader extends Service implements OnDatatransferProgressListe boolean needsToUpdateCredentials = (uploadResult.getCode() == ResultCode.UNAUTHORIZED || (uploadResult.isIdPRedirection() && mUploadClient.getCredentials() == null)); - int tickerId = (needsToUpdateCredentials) ? - R.string.uploader_upload_failed_credentials_error : R.string.uploader_upload_failed_ticker; + tickerId = (needsToUpdateCredentials) ? + R.string.uploader_upload_failed_credentials_error : tickerId; - errorBuilder + resultBuilder .setSmallIcon(R.drawable.notification_icon) .setTicker(getString(tickerId)) .setContentTitle(getString(tickerId)) @@ -793,7 +759,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); updateAccountCredentials.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); updateAccountCredentials.addFlags(Intent.FLAG_FROM_BACKGROUND); - errorBuilder.setContentIntent(PendingIntent.getActivity( + resultBuilder.setContentIntent(PendingIntent.getActivity( this, (int) System.currentTimeMillis(), updateAccountCredentials, PendingIntent.FLAG_ONE_SHOT )); @@ -811,7 +777,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe detailUploadIntent = new Intent(this, FailedUploadActivity.class); detailUploadIntent.putExtra(FailedUploadActivity.MESSAGE, content); } - errorBuilder + resultBuilder .setContentIntent(PendingIntent.getActivity( this, (int) System.currentTimeMillis(), detailUploadIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT )) @@ -838,10 +804,23 @@ public class FileUploader extends Service implements OnDatatransferProgressListe } } - errorBuilder.setContentText(content); - mNotificationManager.notify(tickerId, errorBuilder.build()); + resultBuilder.setContentText(content); + mNotificationManager.notify(tickerId, resultBuilder.build()); + + if (uploadResult.isSuccess()) { + + DbHandler db = new DbHandler(this.getBaseContext()); + db.removeIUPendingFile(mCurrentUpload.getOriginalStoragePath()); + db.close(); + + // remove success notification, with a delay of 2 seconds + NotificationDelayer.cancelWithDelay( + mNotificationManager, + R.string.uploader_upload_succeeded_ticker, + 2000); + + } } - } /** diff --git a/src/com/owncloud/android/notifications/NotificationBuilderWithProgressBar.java b/src/com/owncloud/android/notifications/NotificationBuilderWithProgressBar.java new file mode 100644 index 00000000..3b52f6e4 --- /dev/null +++ b/src/com/owncloud/android/notifications/NotificationBuilderWithProgressBar.java @@ -0,0 +1,136 @@ +/* ownCloud Android client application + * Copyright (C) 2014 ownCloud Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.owncloud.android.notifications; + +import com.owncloud.android.R; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; +import android.support.v4.app.NotificationCompat; +import android.view.View; +import android.widget.RemoteViews; + +/** + * Extends the support class {@link NotificationCompat.Builder} to grant that + * a progress bar is available in every Android version, because + * {@link NotificationCompat.Builder#setProgress(int, int, boolean)} has no + * real effect for Android < 4.0 + * + * @author David A. Velasco + */ +public class NotificationBuilderWithProgressBar extends NotificationCompat.Builder { + + /** + * Custom view to replace the original layout of the notifications + */ + private RemoteViews mContentView = null; + + /** + * Fatory method. + * + * Instances of this class will be only returned in Android versions needing it. + * + * @param context Context that will use the builder to create notifications + * @return An instance of this class, or of the regular + * {@link NotificationCompat.Builder}, when it is good enough. + */ + public static NotificationCompat.Builder newNotificationBuilderWithProgressBar(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return new NotificationBuilderWithProgressBar(context); + } else { + return new NotificationCompat.Builder(context); + } + } + + /** + * Constructor. + * + * @param context Context that will use the builder to create notifications. + */ + private NotificationBuilderWithProgressBar(Context context) { + super(context); + mContentView = new RemoteViews(context.getPackageName(), R.layout.notification_with_progress_bar); + setContent(mContentView); + } + + /** + * {@inheritDoc} + */ + @Override + public NotificationCompat.Builder setProgress(int max, int progress, boolean indeterminate) { + mContentView.setProgressBar(R.id.progress, max, progress, indeterminate); + if (max > 0) { + mContentView.setViewVisibility(R.id.progressHolder, View.VISIBLE); + } else { + mContentView.setViewVisibility(R.id.progressHolder, View.GONE); + } + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public NotificationCompat.Builder setSmallIcon(int icon) { + super.setSmallIcon(icon); // necessary + mContentView.setImageViewResource(R.id.icon, icon); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public NotificationCompat.Builder setContentTitle(CharSequence title) { + super.setContentTitle(title); + mContentView.setTextViewText(R.id.title, title); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public NotificationCompat.Builder setContentText(CharSequence text) { + super.setContentText(text); + mContentView.setTextViewText(R.id.text, text); + if (text != null && text.length() > 0) { + mContentView.setViewVisibility(R.id.text, View.VISIBLE); + } else { + mContentView.setViewVisibility(R.id.text, View.GONE); + } + return this; + } + + @Override + public Notification build() { + Notification result = super.build(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + // super.build() in Android 2.x totally ruins whatever was made #setContent + result.contentView = mContentView; + } + return result; + } + + +} diff --git a/src/com/owncloud/android/notifications/NotificationDelayer.java b/src/com/owncloud/android/notifications/NotificationDelayer.java new file mode 100644 index 00000000..aeefe12c --- /dev/null +++ b/src/com/owncloud/android/notifications/NotificationDelayer.java @@ -0,0 +1,33 @@ +package com.owncloud.android.notifications; + +import java.util.Random; + +import android.app.NotificationManager; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; + +public class NotificationDelayer { + + public static void cancelWithDelay( + final NotificationManager notificationManager, + final int notificationId, + long delayInMillis) { + + HandlerThread thread = new HandlerThread( + "NotificationDelayerThread_" + (new Random(System.currentTimeMillis())).nextInt(), + Process.THREAD_PRIORITY_BACKGROUND); + thread.start(); + + Handler handler = new Handler(thread.getLooper()); + handler.postDelayed(new Runnable() { + public void run() { + notificationManager.cancel(notificationId); + ((HandlerThread)Thread.currentThread()).getLooper().quit(); + } + }, delayInMillis); + + } + + +} diff --git a/src/com/owncloud/android/utils/NotificationBuilderWithProgressBar.java b/src/com/owncloud/android/utils/NotificationBuilderWithProgressBar.java deleted file mode 100644 index c47e469e..00000000 --- a/src/com/owncloud/android/utils/NotificationBuilderWithProgressBar.java +++ /dev/null @@ -1,131 +0,0 @@ -/* ownCloud Android client application - * Copyright (C) 2014 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.owncloud.android.utils; - -import com.owncloud.android.R; - -import android.app.Notification; -import android.content.Context; -import android.os.Build; -import android.support.v4.app.NotificationCompat; -import android.view.View; -import android.widget.RemoteViews; - -/** - * Extends the support class {@link NotificationCompat.Builder} to grant that - * a progress bar is available in every Android version, because - * {@link NotificationCompat.Builder#setProgress(int, int, boolean)} has no - * real effect for Android < 4.0 - * - * @author David A. Velasco - */ -public class NotificationBuilderWithProgressBar extends NotificationCompat.Builder { - - /** - * Custom view to replace the original layout of the notifications - */ - private RemoteViews mContentView = null; - - /** - * Fatory method. - * - * Instances of this class will be only returned in Android versions needing it. - * - * @param context Context that will use the builder to create notifications - * @return An instance of this class, or of the regular - * {@link NotificationCompat.Builder}, when it is good enough. - */ - public static NotificationCompat.Builder newNotificationBuilderWithProgressBar(Context context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return new NotificationBuilderWithProgressBar(context); - } else { - return new NotificationCompat.Builder(context); - } - } - - /** - * Constructor. - * - * @param context Context that will use the builder to create notifications. - */ - private NotificationBuilderWithProgressBar(Context context) { - super(context); - mContentView = new RemoteViews(context.getPackageName(), R.layout.notification_with_progress_bar); - setContent(mContentView); - } - - /** - * {@inheritDoc} - */ - @Override - public NotificationCompat.Builder setProgress(int max, int progress, boolean indeterminate) { - mContentView.setProgressBar(R.id.progress, max, progress, indeterminate); - if (max > 0) { - mContentView.setViewVisibility(R.id.progressHolder, View.VISIBLE); - } else { - mContentView.setViewVisibility(R.id.progressHolder, View.GONE); - } - return this; - } - - /** - * {@inheritDoc} - */ - @Override - public NotificationCompat.Builder setSmallIcon(int icon) { - super.setSmallIcon(icon); // necessary - mContentView.setImageViewResource(R.id.icon, icon); - return this; - } - - /** - * {@inheritDoc} - */ - @Override - public NotificationCompat.Builder setContentTitle(CharSequence title) { - super.setContentTitle(title); - mContentView.setTextViewText(R.id.title, title); - return this; - } - - /** - * {@inheritDoc} - */ - @Override - public NotificationCompat.Builder setContentText(CharSequence text) { - super.setContentText(text); - mContentView.setTextViewText(R.id.text, text); - if (text != null && text.length() > 0) { - mContentView.setViewVisibility(R.id.text, View.VISIBLE); - } else { - mContentView.setViewVisibility(R.id.text, View.GONE); - } - return this; - } - - @Override - public Notification build() { - Notification result = super.build(); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { - // super.build() in Android 2.x totally ruins whatever was made #setContent - result.contentView = mContentView; - } - return result; - } - -}