--- /dev/null
+<?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>
\ No newline at end of file
--- /dev/null
+<?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>
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;
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))
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;
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)
--- /dev/null
+/* 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;
+ }
+
+}