moving from eu.alefzero.eu to com.owncloud.android
[pub/Android/ownCloud.git] / src / com / owncloud / android / files / managers / OCNotificationManager.java
diff --git a/src/com/owncloud/android/files/managers/OCNotificationManager.java b/src/com/owncloud/android/files/managers/OCNotificationManager.java
new file mode 100644 (file)
index 0000000..851a8f8
--- /dev/null
@@ -0,0 +1,154 @@
+/* ownCloud Android client application
+ *   Copyright (C) 2012  Bartek Przybylski
+ *
+ *   This program is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   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.files.managers;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.widget.RemoteViews;
+
+import com.owncloud.android.R;
+
+public class OCNotificationManager {
+
+    enum NotificationType {
+        NOTIFICATION_SIMPLE,
+        NOTIFICATION_PROGRESS
+    }
+    
+    static public class NotificationData {
+        private String mText, mSubtitle;
+        private int mPercent;
+        private boolean mOngoing;
+
+        public NotificationData(String text, String subtitle, boolean ongoing) {
+            this(text, subtitle, -1, ongoing);
+        }
+        
+        public NotificationData(int percent, boolean ongoing) {
+            this(null, null, percent, ongoing);
+        }
+        
+        public NotificationData(String text, int percent, boolean ongoing) {
+            this(text, null, percent, ongoing);
+        }
+        
+        public NotificationData(String text, String subtitle, int percent, boolean ongoing) {
+            mText = text;
+            mPercent = percent;
+            mSubtitle = subtitle;
+            mOngoing = ongoing;
+        }
+        
+        public String getText() { return mText; }
+        public int getPercent() { return mPercent; }
+        public String getSubtitle() { return mSubtitle; }
+        public boolean getOngoing() { return mOngoing; }
+    }
+    
+    static private OCNotificationManager mInstance = null;
+
+    private class NotificationTypePair {
+        public Notification mNotificaiton;
+        public NotificationType mType;
+        public NotificationTypePair(Notification n, NotificationType type) {
+            mNotificaiton = n;
+            mType = type;
+        }
+    }
+    
+    private Context mContext;
+    private Map<Integer, NotificationTypePair> mNotificationMap;
+    private int mNotificationCounter;
+    NotificationManager mNM;
+    
+    static OCNotificationManager getInstance(Context context) {
+        if (mInstance == null)
+            mInstance = new OCNotificationManager(context);
+        return mInstance;
+    }
+    
+    OCNotificationManager(Context context) {
+        mContext = context;
+        mNotificationMap = new HashMap<Integer, NotificationTypePair>();
+        mNM = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+        mNotificationCounter = 0;
+    }
+    
+    public int postNotification(NotificationType type, NotificationData data) {
+        mNotificationCounter++;
+        Notification notification = null;
+        
+        switch (type) {
+            case NOTIFICATION_SIMPLE:
+                notification = new Notification(R.drawable.icon, data.getText(), System.currentTimeMillis());
+                break;
+            case NOTIFICATION_PROGRESS:
+                notification = new Notification();
+                notification.contentView = new RemoteViews(mContext.getPackageName(), R.layout.progressbar_layout);
+                notification.contentView.setTextViewText(R.id.status_text,
+                                                         data.getText());
+                notification.contentView.setImageViewResource(R.id.status_icon,
+                                                              R.id.icon);
+                notification.contentView.setProgressBar(R.id.status_progress,
+                                                        100,
+                                                        data.getPercent(),
+                                                        false);
+                break;
+            default:
+                return -1;
+        }
+        if (data.getOngoing()) {
+            notification.flags |= notification.flags | Notification.FLAG_ONGOING_EVENT;
+        }
+        
+        mNotificationMap.put(mNotificationCounter, new NotificationTypePair(notification, type));
+        return mNotificationCounter;
+    }
+    
+    public boolean updateNotification(int notification_id, NotificationData data) {
+        if (!mNotificationMap.containsKey(notification_id)) {
+            return false;
+        }
+        NotificationTypePair pair = mNotificationMap.get(notification_id);
+        switch (pair.mType) {
+            case NOTIFICATION_PROGRESS:
+                pair.mNotificaiton.contentView.setProgressBar(R.id.status_text,
+                                                              100,
+                                                              data.getPercent(),
+                                                              false);
+                return true;
+            case NOTIFICATION_SIMPLE:
+                pair.mNotificaiton = new Notification(R.drawable.icon,
+                                                      data.getText(), System.currentTimeMillis());
+                mNM.notify(notification_id, pair.mNotificaiton);
+                return true;
+            default:
+                return false;
+        }
+    }
+    
+    public void discardNotification(int notification_id) {
+        mNM.cancel(notification_id);
+        mNotificationMap.remove(notification_id);
+    }
+}