From: David A. Velasco Date: Mon, 2 Jun 2014 08:38:14 +0000 (+0200) Subject: Cancelation of notifications on success moved to a separate thread X-Git-Tag: oc-android-1.7.0_signed~294^2~3 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/17ffd07e36497be3f81b4874229a121f982b2a5e?ds=inline;hp=--cc Cancelation of notifications on success moved to a separate thread --- 17ffd07e36497be3f81b4874229a121f982b2a5e diff --git a/src/com/owncloud/android/files/services/FileDownloader.java b/src/com/owncloud/android/files/services/FileDownloader.java index b525bc4a..ba9824ad 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; @@ -507,12 +508,18 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis // 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); + /* Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { mNotificationManager.cancel(R.string.downloader_download_succeeded_ticker); } - }, 2000); + }, 2000); + */ } diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 7a04a22d..731522cf 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; @@ -54,7 +56,6 @@ import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.InstantUploadActivity; 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; @@ -809,12 +810,10 @@ public class FileUploader extends Service implements OnDatatransferProgressListe // Remove success notification if (uploadResult.isSuccess()) { // Sleep 2 seconds, so show the notification before remove it - Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - public void run() { - mNotificationManager.cancel(R.string.uploader_upload_succeeded_ticker); - } - }, 2000); + 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..61cb07b2 --- /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().quitSafely(); + } + }, 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; - } - -}