Explorar o código

Merge pull request #444 from owncloud/improve_notifications_pr_400_with_develop

Fix several problems about notifications in Android 2.x and 3.x after upgrade to newest Android notifications API
masensio %!s(int64=11) %!d(string=hai) anos
pai
achega
ea3cf34349

BIN=BIN
res/drawable-hdpi-v11/notification_icon.png


BIN=BIN
res/drawable-hdpi/notification_icon.png


BIN=BIN
res/drawable-mdpi-v11/notification_icon.png


BIN=BIN
res/drawable-mdpi/notification_icon.png


BIN=BIN
res/drawable-xhdpi-v11/notification_icon.png


BIN=BIN
res/drawable-xhdpi/notification_icon.png


+ 69 - 0
res/layout-v11/notification_with_progress_bar.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 
+    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 <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    >
+    <ImageView android:id="@+id/icon"
+        android:layout_width="@android:dimen/notification_large_icon_width"
+        android:layout_height="@android:dimen/notification_large_icon_height"
+        android:scaleType="center"
+        />
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:minHeight="64dp"
+        android:orientation="vertical"
+        android:paddingRight="12dp"
+        android:paddingLeft="12dp"
+        >
+		<TextView android:id="@+id/title"
+			android:layout_width="match_parent"
+			android:layout_height="wrap_content"
+			android:singleLine="true"
+			android:ellipsize="marquee"
+            android:fadingEdge="horizontal"
+            style="@style/Theme.ownCloud.NotificationText.Title"
+        	/>
+        <TextView android:id="@+id/text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="-2dp"
+            android:layout_marginBottom="-2dp"
+            android:singleLine="true"
+            android:fadingEdge="horizontal"
+            android:ellipsize="marquee"
+            style="@style/Theme.ownCloud.NotificationText.Content"
+            />
+        <FrameLayout android:id="@+id/progressHolder"
+            android:layout_width="match_parent"
+            android:layout_height="12dp"
+            >
+            <!--  the FrameLayout is needed to change visibility of the
+            	progress bar in Android 2.2, even though 
+            	https://code.google.com/p/android/issues/detail?id=11040 -->
+	        <ProgressBar
+	            android:id="@+id/progress"
+	            android:layout_width="match_parent"
+	            android:layout_height="match_parent"
+	            style="?android:attr/progressBarStyleHorizontal"
+	            />
+        </FrameLayout>
+    </LinearLayout>
+</LinearLayout>

+ 71 - 0
res/layout/notification_with_progress_bar.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 
+    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 <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:paddingTop="5dp"
+        android:paddingLeft="5dp"
+        >
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:paddingTop="3dp"
+        >
+        <ImageView android:id="@+id/icon"
+            android:layout_width="25dp"
+            android:layout_height="25dp"
+            android:scaleType="centerInside"
+            />
+        <TextView android:id="@+id/title"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:singleLine="true"
+            android:ellipsize="marquee"
+            android:fadingEdge="horizontal"
+            android:paddingLeft="4dp"
+        	style="@style/Theme.ownCloud.NotificationText.Title"
+            />
+    </LinearLayout>
+	<TextView android:id="@+id/text"
+	    android:layout_width="match_parent"
+	    android:layout_height="wrap_content"
+	    android:singleLine="true"
+	    android:ellipsize="marquee"
+	    android:fadingEdge="horizontal"
+        style="@style/Theme.ownCloud.NotificationText.Content"
+	    />
+    <FrameLayout android:id="@+id/progressHolder"
+        android:layout_width="match_parent"
+        android:layout_height="10dp"
+        android:paddingTop="2dp"
+        android:paddingBottom="2dp"
+        >
+        <!--  the FrameLayout is needed to change visibility of the
+        	progress bar in Android 2.2, even though 
+        	https://code.google.com/p/android/issues/detail?id=11040 -->
+		<ProgressBar
+    		android:id="@+id/progress"
+    		android:layout_width="match_parent"
+    		android:layout_height="match_parent"
+    		style="?android:attr/progressBarStyleHorizontal"
+    	/>
+    </FrameLayout>
+</LinearLayout>

+ 13 - 0
res/values-v11/versioned_styles.xml

@@ -6,4 +6,17 @@
 		<item name="android:textColor">@color/button_text_color</item>
 	</style>
 
+	<!-- Notifications -->
+	<!-- Notifications -->
+	<style 	name="Theme.ownCloud.NotificationText.Title" 
+	    	parent="@android:style/TextAppearance.StatusBar.EventContent.Title" > 
+		<item name="android:textSize">18sp</item>
+        <item name="android:textStyle">bold</item>
+	</style>
+
+	<style 	name="Theme.ownCloud.NotificationText.Content" 
+	    	parent="@android:style/TextAppearance.StatusBar.EventContent"	>
+        <item name="android:textSize">16sp</item>
+	</style>
+	
 </resources>

+ 12 - 0
res/values-v9/versioned_styles.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+	
+	<!-- Notifications -->
+	<style name="Theme.ownCloud.NotificationText.Title" 
+	    parent="@android:style/TextAppearance.StatusBar.EventContent.Title" 
+	    />
+	<style name="Theme.ownCloud.NotificationText.Content" 
+	    parent="@android:style/TextAppearance.StatusBar.EventContent" 
+	    />
+	
+</resources>

+ 12 - 0
res/values/versioned_styles.xml

@@ -16,4 +16,16 @@
 	    <item name="android:indeterminateDrawable">@drawable/abs__progress_medium_holo</item>
 	</style>
 
+	<!-- Notifications -->
+	<style 	name="Theme.ownCloud.NotificationText.Title" 
+	    	parent="@android:style/TextAppearance">
+        <item name="android:textColor">#ff000000</item>
+		<item name="android:textSize">18sp</item>
+        <item name="android:textStyle">bold</item>
+	</style>
+	<style 	name="Theme.ownCloud.NotificationText.Content" 
+	    	parent="@android:style/TextAppearance">
+        <item name="android:textColor">#ff000000</item>
+		<item name="android:textSize">14sp</item>
+	</style>
 </resources>

+ 6 - 5
src/com/owncloud/android/files/services/FileDownloader.java

@@ -44,12 +44,11 @@ import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.preview.PreviewImageActivity;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
-import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.Log_OC;
+import com.owncloud.android.utils.NotificationBuilderWithProgressBar;
 
 import android.accounts.Account;
 import android.accounts.AccountsException;
-import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
@@ -62,7 +61,6 @@ import android.os.Looper;
 import android.os.Message;
 import android.os.Process;
 import android.support.v4.app.NotificationCompat;
-import android.widget.RemoteViews;
 
 public class FileDownloader extends Service implements OnDatatransferProgressListener {
     
@@ -405,7 +403,8 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
     private void notifyDownloadStart(DownloadFileOperation download) {
         /// create status notification with a progress bar
         mLastPercent = 0;
-        mNotificationBuilder = new NotificationCompat.Builder(this);
+        mNotificationBuilder = 
+                NotificationBuilderWithProgressBar.newNotificationBuilderWithProgressBar(this);
         mNotificationBuilder
                 .setSmallIcon(R.drawable.notification_icon)
                 .setTicker(getString(R.string.downloader_download_in_progress_ticker))
@@ -467,7 +466,9 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
             mNotificationBuilder
                 .setTicker(getString(tickerId))
                 .setContentTitle(getString(tickerId))
-                .setAutoCancel(true);
+                .setAutoCancel(true)
+                .setOngoing(false)
+                .setProgress(0, 0, false);
             boolean needsToUpdateCredentials = (downloadResult.getCode() == ResultCode.UNAUTHORIZED ||
                                                 // (downloadResult.isTemporalRedirection() && downloadResult.isIdPRedirection()
                                                   (downloadResult.isIdPRedirection()

+ 7 - 7
src/com/owncloud/android/files/services/FileUploader.java

@@ -53,13 +53,12 @@ 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.DisplayUtils;
 import com.owncloud.android.utils.Log_OC;
+import com.owncloud.android.utils.NotificationBuilderWithProgressBar;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AccountsException;
-import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.app.Service;
@@ -73,7 +72,6 @@ import android.os.Message;
 import android.os.Process;
 import android.support.v4.app.NotificationCompat;
 import android.webkit.MimeTypeMap;
-import android.widget.RemoteViews;
 
 
 
@@ -120,7 +118,6 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
     private NotificationManager mNotificationManager;
     private NotificationCompat.Builder mNotificationBuilder;
     private int mLastPercent;
-    private RemoteViews mDefaultNotificationContentView;
 
     
     public static String getUploadFinishMessage() {
@@ -679,11 +676,11 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
      * 
      * @param upload Upload operation starting.
      */
-    @SuppressWarnings("deprecation")
     private void notifyUploadStart(UploadFileOperation upload) {
         // / create status notification with a progress bar
         mLastPercent = 0;
-        mNotificationBuilder = new NotificationCompat.Builder(this);
+        mNotificationBuilder = 
+                NotificationBuilderWithProgressBar.newNotificationBuilderWithProgressBar(this);
         mNotificationBuilder
                 .setOngoing(true)
                 .setSmallIcon(R.drawable.notification_icon)
@@ -736,7 +733,10 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
         } else if (uploadResult.isSuccess()) {
             // / success -> silent update of progress notification to success
             // message
-            mNotificationBuilder.setOngoing(false).setAutoCancel(true);
+            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;

+ 131 - 0
src/com/owncloud/android/utils/NotificationBuilderWithProgressBar.java

@@ -0,0 +1,131 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+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;
+    }
+    
+}

BIN=BIN
third_party/android-support-library/android-support-v4.jar