package com.jdroid.android.notification; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; import android.support.annotation.StringRes; import android.support.annotation.WorkerThread; import android.support.v4.app.NotificationCompat; import android.widget.RemoteViews; import com.jdroid.android.R; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.images.BitmapUtils; import com.jdroid.android.uri.UriUtils; import com.jdroid.android.utils.AppUtils; import com.jdroid.android.utils.LocalizationUtils; import com.jdroid.android.uri.ReferrerUtils; import com.jdroid.java.exception.UnexpectedException; import com.jdroid.java.utils.RandomUtils; import com.jdroid.java.utils.StringUtils; import com.nostra13.universalimageloader.core.assist.ImageScaleType; public class NotificationBuilder { public static final String NOTIFICATION_NAME = "notificationName"; public static String NOTIFICATION_URI = "notification://"; private String notificationName; private NotificationCompat.Builder builder; public NotificationBuilder(String notificationName) { this.notificationName = notificationName; if (notificationName == null) { throw new UnexpectedException("Missing notificationName"); } Context context = AbstractApplication.get(); builder = new NotificationCompat.Builder(context); builder.setAutoCancel(true); setColor(R.color.jdroid_colorPrimary); } public NotificationCompat.Builder getNotificationCompatBuilder() { return builder; } public Notification build() { return builder.build(); } public void setSmallIcon(@DrawableRes int icon) { builder.setSmallIcon(icon); } public void setTicker(int tickerId, Object... args) { setTicker(LocalizationUtils.getString(tickerId, args)); } public void setTicker(String tickerText) { builder.setTicker(tickerText); } public void setContentTitle(@StringRes int contentTitleId, Object... args) { setContentTitle(LocalizationUtils.getString(contentTitleId, args)); } public void setContentTitle(String contentTitle) { builder.setContentTitle(contentTitle); } public void setContentText(@StringRes int contentTextId, Object... args) { setContentText(LocalizationUtils.getString(contentTextId, args)); } public void setContentText(String contentText) { builder.setContentText(contentText); } public void setContentIntentSingleTop(Class<?> clazz) { setContentIntentSingleTop(clazz, null); } public void setContentIntentSingleTop(Class<?> clazz, Bundle notificationBundle) { Intent notificationIntent = clazz != null ? new Intent(AbstractApplication.get(), clazz) : new Intent(); if (notificationBundle != null) { notificationIntent.replaceExtras(notificationBundle); } setContentIntentSingleTop(notificationIntent); } public void setContentIntentSingleTop(Intent notificationIntent) { notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); setContentIntent(notificationIntent); } public void setContentIntentNewTask(Intent notificationIntent) { notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); setContentIntent(notificationIntent); } public void setContentIntent(Intent notificationIntent) { // TODO Disabled to avoid session creation on Google Analytics // AbstractApplication.get().getAnalyticsSender().trackNotificationDisplayed(notificationName); notificationIntent.putExtra(NOTIFICATION_NAME, notificationName); // This is a hack to avoid the notification caching if (notificationIntent.getData() == null) { notificationIntent.setData(createUniqueNotificationUri()); } ReferrerUtils.setReferrer(notificationIntent, generateNotificationsReferrer()); builder.setContentIntent(PendingIntent.getActivity(AbstractApplication.get(), RandomUtils.get16BitsInt(), notificationIntent, 0)); } public void setNewTaskUrl(String url) { setUrl(url, Intent.FLAG_ACTIVITY_NEW_TASK); } public void setSingleTopUrl(String url) { setUrl(url, Intent.FLAG_ACTIVITY_SINGLE_TOP); } public void setUrl(String url) { setUrl(url, null); } public void setUrl(String url, Integer flags) { if (StringUtils.isNotEmpty(url)) { Intent notificationIntent = UriUtils.createIntent(AbstractApplication.get(), url, generateNotificationsReferrer()); if (flags != null) { notificationIntent.setFlags(flags); } setContentIntent(notificationIntent); } } public static String generateNotificationsReferrer() { return "notification://" + AppUtils.getApplicationId(); } protected Uri createUniqueNotificationUri() { return Uri.parse(NOTIFICATION_URI + RandomUtils.getInt()); } public void setWhen(Long when) { if (when != null) { builder.setWhen(when); } } public void setLargeIcon(@DrawableRes int resId) { builder.setLargeIcon(BitmapUtils.toBitmap(resId)); } public void setLargeIcon(Bitmap largeIcon) { if (largeIcon != null) { builder.setLargeIcon(largeIcon); } } @WorkerThread public void setLargeIcon(String largeIconUrl) { if (largeIconUrl != null) { builder.setLargeIcon(createLargeIconBitmap(largeIconUrl)); } } public void setInProgress(@DrawableRes int notificationIcon, int progress, int contentTitle, int actionText) { builder.setOngoing(true); Context context = AbstractApplication.get(); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.jdroid_notification_inprogress); remoteViews.setTextViewText(R.id.title, context.getString(contentTitle)); remoteViews.setTextViewText(R.id.action, context.getString(actionText)); remoteViews.setTextViewText(R.id.progressPercentage, progress + "%"); remoteViews.setProgressBar(R.id.progressBar, 100, progress, false); remoteViews.setImageViewResource(R.id.icon, notificationIcon); builder.setContent(remoteViews); } public void setColor(@ColorRes int colorResId) { builder.setColor(AbstractApplication.get().getResources().getColor(colorResId)); } public void setColor(String color) { builder.setColor(Color.parseColor(color)); } public void setWhiteLight() { setLight("white"); } public void setBlueLight() { setLight("blue"); } private void setLight(String color) { builder.setLights(Color.parseColor(color), 1000, 5000); } public void setSound(int soundResId) { Uri notificationSound = Uri.parse("android.resource://" + AppUtils.getApplicationId() + "/" + soundResId); if (notificationSound != null) { builder.setSound(notificationSound); } } public void setDefaultSound() { Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); if (notificationSound != null) { builder.setSound(notificationSound); } } public void setMaxPriority() { builder.setPriority(NotificationCompat.PRIORITY_MAX); } public void setHighPriority() { builder.setPriority(NotificationCompat.PRIORITY_HIGH); } public void setLowPriority() { builder.setPriority(NotificationCompat.PRIORITY_LOW); } public void setMinPriority() { builder.setPriority(NotificationCompat.PRIORITY_MIN); } public void setCategory(String category) { builder.setCategory(category); } public void setPublicVisibility() { builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC); } public void setPrivateVisibility() { builder.setVisibility(NotificationCompat.VISIBILITY_PRIVATE); } public void setSecretVisibility() { builder.setVisibility(NotificationCompat.VISIBILITY_SECRET); } public void addPerson(String uri) { builder.addPerson(uri); } public void setDefaultVibration() { long[] defaultPattern = { 1000, 500 }; builder.setVibrate(defaultPattern); } private Bitmap createLargeIconBitmap(String largeIconUrl) { Bitmap largeIconBitmap = null; if (StringUtils.isNotEmpty(largeIconUrl)) { largeIconBitmap = AbstractApplication.get().getImageLoaderHelper().loadBitmap(largeIconUrl, ImageScaleType.EXACTLY, NotificationUtils.getNotificationLargeIconWidthPx(), NotificationUtils.getNotificationLargeIconHeightPx(), null); } return largeIconBitmap; } public void setBigTextStyle(String title, String text) { if (StringUtils.isNotBlank(title) && StringUtils.isNotBlank(text)) { NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle(); bigTextStyle.setBigContentTitle(title); bigTextStyle.bigText(text); builder.setStyle(bigTextStyle); } } public void addStartActivityAction(@DrawableRes int icon, @StringRes int titleId, Intent intent) { addStartActivityAction(icon, LocalizationUtils.getString(titleId), intent); } public void addStartActivityAction(@DrawableRes int icon, String title, Intent intent) { PendingIntent pendingIntent = PendingIntent.getActivity(AbstractApplication.get(), RandomUtils.get16BitsInt(), intent, 0); builder.addAction(icon, title, pendingIntent); } public void addStartServiceAction(@DrawableRes int icon, @StringRes int titleId, Intent intent) { addStartServiceAction(icon, LocalizationUtils.getString(titleId), intent); } public void addStartServiceAction(@DrawableRes int icon, String title, Intent intent) { PendingIntent pendingIntent = PendingIntent.getService(AbstractApplication.get(), RandomUtils.getInt(), intent, 0); builder.addAction(icon, title, pendingIntent); } public void setShowWhen(boolean show) { builder.setShowWhen(show); } }