/** * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * * Created on 9/1/15 6:51 PM */ package com.odoo.core.utils.notification; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import com.odoo.R; import com.odoo.core.account.BaseSettings; import com.odoo.core.utils.OPreferenceManager; import com.odoo.core.utils.OResource; import java.util.ArrayList; import java.util.List; public class ONotificationBuilder { public static final String TAG = ONotificationBuilder.class.getSimpleName(); private Context mContext; private Builder mNotificationBuilder = null; private PendingIntent mNotificationResultIntent = null; private NotificationManager mNotificationManager = null; private String title, text, bigText; private boolean mOnGoing = false, mAutoCancel = true; private Intent resultIntent = null; private int icon = R.drawable.ic_odoo_o_white; private int small_icon = R.drawable.ic_odoo_o_white; private List<NotificationAction> mActions = new ArrayList<ONotificationBuilder.NotificationAction>(); private int notification_id = 0; private Boolean withVibrate = true; private Boolean withLargeIcon = true; private Boolean withRingTone = true; private int notification_color = R.color.theme_secondary; private OPreferenceManager mPref; private int maxProgress = -1; private int currentProgress = -1; private boolean indeterminate = false; private Bitmap bigPictureStyle = null; public ONotificationBuilder(Context context, int notification_id) { mContext = context; mPref = new OPreferenceManager(mContext); this.notification_id = notification_id; } public ONotificationBuilder setTitle(String title) { this.title = title; return this; } public ONotificationBuilder setText(String text) { this.text = text; return this; } public ONotificationBuilder setIcon(int res_id) { icon = res_id; return this; } public ONotificationBuilder withLargeIcon(boolean largeIcon) { withLargeIcon = largeIcon; return this; } public boolean withLargeIcon() { return withLargeIcon; } public ONotificationBuilder withRingTone(Boolean ringTone) { withRingTone = ringTone; return this; } public boolean withRingTone() { return withRingTone; } public ONotificationBuilder setBigPicture(Bitmap bitmap) { bigPictureStyle = bitmap; return this; } public ONotificationBuilder setBigText(String bigText) { this.bigText = bigText; return this; } public ONotificationBuilder setOngoing(boolean onGoing) { mOnGoing = onGoing; return this; } public ONotificationBuilder setAutoCancel(boolean autoCancel) { mAutoCancel = autoCancel; return this; } public ONotificationBuilder addAction(NotificationAction action) { mActions.add(action); return this; } public ONotificationBuilder allowVibrate(Boolean vibrate) { withVibrate = vibrate; return this; } public ONotificationBuilder setColor(int res_id) { notification_color = res_id; return this; } public ONotificationBuilder setProgress(int max, int progress, boolean indeterminate) { maxProgress = max; currentProgress = progress; this.indeterminate = indeterminate; return this; } private void init() { mNotificationManager = (NotificationManager) mContext .getSystemService(Context.NOTIFICATION_SERVICE); mNotificationBuilder = new NotificationCompat.Builder(mContext); mNotificationBuilder.setContentTitle(title); mNotificationBuilder.setContentText(text); if (bigText == null) mNotificationBuilder.setContentInfo(text); if (withLargeIcon()) { mNotificationBuilder.setSmallIcon(small_icon); Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(), this.icon); Bitmap newIcon = Bitmap.createBitmap(icon.getWidth(), icon.getHeight(), icon.getConfig()); Canvas canvas = new Canvas(newIcon); canvas.drawColor(OResource.color(mContext, R.color.theme_primary)); canvas.drawBitmap(icon, 0, 0, null); mNotificationBuilder.setLargeIcon(newIcon); } else { mNotificationBuilder.setSmallIcon(icon); } mNotificationBuilder.setAutoCancel(mAutoCancel); mNotificationBuilder.setOngoing(mOnGoing); mNotificationBuilder.setColor(OResource.color(mContext, notification_color)); if (bigText != null) { NotificationCompat.BigTextStyle notiStyle = new NotificationCompat.BigTextStyle(); notiStyle.setBigContentTitle(title); notiStyle.setSummaryText(text); notiStyle.bigText(bigText); mNotificationBuilder.setStyle(notiStyle); } if (bigPictureStyle != null) { mNotificationBuilder.setStyle(new NotificationCompat.BigPictureStyle() .bigPicture(bigPictureStyle)); } if (maxProgress != -1) { mNotificationBuilder.setProgress(maxProgress, currentProgress, indeterminate); } } private void setSoundForNotification() { Uri uri = BaseSettings.getNotificationRingTone(mContext); mNotificationBuilder.setSound(uri); } private void setVibrateForNotification() { mNotificationBuilder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); } public ONotificationBuilder setResultIntent(Intent intent) { resultIntent = intent; return this; } public ONotificationBuilder build() { init(); if (withVibrate) { setVibrateForNotification(); } if (withRingTone()) setSoundForNotification(); if (resultIntent != null) { _setResultIntent(); } if (mActions.size() > 0) { _addActions(); } return this; } private void _addActions() { for (NotificationAction action : mActions) { Intent intent = new Intent(mContext, action.getIntent()); intent.setAction(action.getAction()); intent.putExtras(action.getExtras()); PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); mNotificationBuilder.addAction(action.getIcon(), action.getTitle(), pendingIntent); } } private void _setResultIntent() { mNotificationResultIntent = PendingIntent.getActivity(mContext, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); mNotificationBuilder.setDefaults(Notification.DEFAULT_ALL); if (mPref.getBoolean("hands_up_notification", true)) { mNotificationBuilder.setFullScreenIntent(mNotificationResultIntent, true); } else { mNotificationBuilder.setContentIntent(mNotificationResultIntent); } } public void show() { if (mNotificationBuilder == null) { build(); } mNotificationManager.notify(notification_id, mNotificationBuilder.build()); } public static void cancelNotification(Context context){ NotificationManager nMgr = (NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE ); nMgr.cancelAll();; } public static void cancelNotification(Context context, int id) { NotificationManager nMgr = (NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE ); nMgr.cancel(id); } public static class NotificationAction { private int icon; private int requestCode; private String title; private String action; private Bundle extras; private Class<?> intent; public NotificationAction(int icon, String title, int requestCode, String action, Class<?> intent, Bundle extras) { super(); this.icon = icon; this.title = title; this.requestCode = requestCode; this.action = action; this.intent = intent; this.extras = extras; } public Class<?> getIntent() { return intent; } public void setIntent(Class<?> intent) { this.intent = intent; } public int getIcon() { return icon; } public void setIcon(int icon) { this.icon = icon; } public int getRequestCode() { return requestCode; } public void setRequestCode(int requestCode) { this.requestCode = requestCode; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAction() { return action; } public void setAction(String action) { this.action = action; } public Bundle getExtras() { return extras; } public void setExtras(Bundle extras) { this.extras = extras; } } }