Эх сурвалжийг харах

Grant that progress bar in notifications is shown in Android 2.x and 3.x devices

David A. Velasco 11 жил өмнө
parent
commit
604abaf3b4

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

@@ -0,0 +1,72 @@
+<?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"
+			android:textColor="?android:attr/textColorPrimary"
+        	android:textSize="18sp"
+        	android:textStyle="bold"
+        	/>
+        <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"
+			android:textColor="?android:attr/textColorSecondary"
+        	android:textSize="16sp"
+            />
+        <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>

+ 74 - 0
res/layout/notification_with_progress_bar.xml

@@ -0,0 +1,74 @@
+<?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="fitCenter"
+            android:background="@android:drawable/status_bar_item_app_background"
+            />
+        <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"
+			android:textSize="18sp"
+        	android:textStyle="bold"
+        	android:textColor="?android:attr/textColorPrimaryInverse"
+            />
+    </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"
+        android:textColor="?android:attr/textColorPrimaryInverse"
+	    />
+    <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>

+ 3 - 1
src/com/owncloud/android/files/services/FileDownloader.java

@@ -45,6 +45,7 @@ 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.Log_OC;
+import com.owncloud.android.utils.NotificationBuilderWithProgressBar;
 
 import android.accounts.Account;
 import android.accounts.AccountsException;
@@ -402,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))

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

@@ -54,6 +54,7 @@ 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.Log_OC;
+import com.owncloud.android.utils.NotificationBuilderWithProgressBar;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
@@ -678,7 +679,8 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
     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)

+ 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;
+    }
+    
+}