package net.i2p.android.router.service; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import net.i2p.android.I2PActivity; import net.i2p.android.router.R; class StatusBar { private Context mCtx; private final NotificationManager mNotificationManager; private final NotificationCompat.Builder mNotifyBuilder; private Notification mNotif; private static final int ID = 1337; public static final int ICON_STARTING = R.drawable.ic_stat_router_starting; public static final int ICON_RUNNING = R.drawable.ic_stat_router_running; public static final int ICON_ACTIVE = R.drawable.ic_stat_router_active; public static final int ICON_STOPPING = R.drawable.ic_stat_router_stopping; public static final int ICON_SHUTTING_DOWN = R.drawable.ic_stat_router_shutting_down; public static final int ICON_WAITING_NETWORK = R.drawable.ic_stat_router_waiting_network; StatusBar(Context ctx) { mCtx = ctx; mNotificationManager = (NotificationManager) ctx.getSystemService( Context.NOTIFICATION_SERVICE); Thread.currentThread().setUncaughtExceptionHandler( new CrashHandler(mNotificationManager)); int icon = ICON_STARTING; // won't be shown if replace() is called String text = ctx.getString(R.string.notification_status_starting); mNotifyBuilder = new NotificationCompat.Builder(ctx) .setContentText(text) .setSmallIcon(icon) .setColor(mCtx.getResources().getColor(R.color.primary_light)) .setOngoing(true) .setOnlyAlertOnce(true); Intent intent = new Intent(ctx, I2PActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pi = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); mNotifyBuilder.setContentIntent(pi); } public void replace(int icon, int textResource) { replace(icon, mCtx.getString(textResource)); } public void replace(int icon, String title) { mNotifyBuilder.setSmallIcon(icon) .setStyle(null) .setTicker(title); update(title); } public void update(String title) { update(title, null); } public void update(String title, String text, String bigText) { mNotifyBuilder.setStyle(new NotificationCompat.BigTextStyle() .bigText(bigText)); update(title, text); } public void update(String title, String text) { mNotifyBuilder.setContentTitle(title) .setContentText(text); mNotif = mNotifyBuilder.build(); mNotificationManager.notify(ID, mNotif); } public void remove() { mNotificationManager.cancel(ID); } /** * http://stackoverflow.com/questions/4028742/how-to-clear-a-notification-if-activity-crashes */ private static class CrashHandler implements Thread.UncaughtExceptionHandler { private final Thread.UncaughtExceptionHandler defaultUEH; private final NotificationManager mgr; public CrashHandler(NotificationManager nMgr) { defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); mgr = nMgr; } public void uncaughtException(Thread t, Throwable e) { if (mgr != null) { try { mgr.cancel(ID); } catch (Throwable ex) {} } System.err.println("In CrashHandler " + e); e.printStackTrace(System.err); defaultUEH.uncaughtException(t, e); } } public Notification getNote() { return mNotif; } }