Manu
Manu

Reputation: 379

Android Wear custom Notification

When the custom notification is peeking on the homescreen, the system displays it with a standard template that it generates from the notification's semantic data. I have to swipe the notification up, to see the custom activity for the notification. I'm showing 'Swipe up to view' text as title for standard template. My question is, Can i replace "Swipe up to view" with a time counter, which increase with timer?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String ns = getApplicationContext().NOTIFICATION_SERVICE;
    mNotificationManager = (NotificationManager) getSystemService(ns);
    callNotification(Html.fromHtml(getFormattedTime(CurrentPausedTime)),false,false);
    Thread notifyingThread = new Thread(null, updateTimerTaskCustom, "NotifyingServiceNew");
    notifyingThread.start();

}
private void callNotification(final Spanned spanned,boolean isPause,boolean pauseAction) {
    // TODO Auto-generated method stub

     displayIntent = new Intent(getApplicationContext(), CustomNotification.class);
     displayIntent.putExtra("exerciseTitle", "Running");
     displayIntent.putExtra("duration", CurrentPausedTime);
     displayIntent.putExtra("elepsedTime", 0);
     displayIntent.putExtra("isPause", isPause);

     displayPendingIntent = PendingIntent.getActivity(getApplicationContext(),
             0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);


     Intent deleteIntent = new Intent(getApplicationContext(), ClearNotification.class);
     deletePendingIntent = PendingIntent.getActivity(getApplicationContext(),
             0, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);


     Intent pauseIntent = new Intent(ExerciseActionReciever.ACTION_PAUSE,
             null,getApplicationContext(), ExerciseActionReciever.class);
     pausePendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
             0, pauseIntent, PendingIntent.FLAG_UPDATE_CURRENT);

     Intent stopIntent =new Intent(ExerciseActionReciever.ACTION_STOP,
             null,getApplicationContext(), ExerciseActionReciever.class);
     stopPendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
             0, stopIntent,  PendingIntent.FLAG_UPDATE_CURRENT);
     Intent resumeIntent = new Intent(ExerciseActionReciever.ACTION_RESUME,
             null, getApplicationContext(), ExerciseActionReciever.class);
     resumePendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, resumeIntent,  PendingIntent.FLAG_UPDATE_CURRENT);

     NotificationCompat.WearableExtender wearableExtender =
                new NotificationCompat.WearableExtender()
                .setHintHideIcon(true)
                .setContentIcon(R.drawable.icon)
                .setDisplayIntent(displayPendingIntent);


         mNotifyBuilder =
                 new NotificationCompat.Builder(getApplicationContext())
         .setSmallIcon(R.drawable.icon)
         .setContentTitle(""+spanned)
         .setDeleteIntent(deletePendingIntent)
         .extend(wearableExtender)
         .addAction(R.drawable.icon, "Resume", resumePendingIntent)
         .addAction(R.drawable.icon, "Stop", stopPendingIntent);

}

private Runnable updateTimerTaskCustom = new Runnable() {

    public void run() {
        timerHandlerCustom.removeCallbacks(updateTimerTaskCustom);
        timerHandlerCustom.postDelayed(updateTimerTaskCustom, 1000);
        if(!CustomNotification.isCustomCardAcrivityvisible )
        {
            CurrentPausedTime = CurrentPausedTime+1000;
            mNotifyBuilder.setContentTitle(""+Html.fromHtml(getFormattedTime(CurrentPausedTime)));
             mNotificationManager.notify(NOTIFICTIONTION_ID , mNotifyBuilder.build());          

        }

    }

};

Upvotes: 0

Views: 1031

Answers (1)

Maciej Ciemięga
Maciej Ciemięga

Reputation: 10715

You can replace "Swipe up to view" with any text you want - like "53 sec". To update this value you will need to simply update your notification.

More information about updating notifications: http://developer.android.com/training/notify-user/managing.html

BTW. If you want to optimise your code the note on top might be important to you:

When you need to issue a notification multiple times for the same type of event, you should avoid making a completely new notification. Instead, you should consider updating a previous notification, either by changing some of its values or by adding to it, or both.

EDIT: If you want, in addition, to use this solution with custom layout Activity you need to prevent notification from refreshing when this Activity is visible. Otherwise you will end up with Activity being created over and over again (blinking layout). Custom Activity in card layout is visible between the onResume and onPause events, so you need to detect that and update the whole notification ONLY when Activity is NOT visible to the user. The simpliest way is to use a static flag, but you can also play with other more advanced solutions (like LocalBroadcastManager etc.) to achieve this goal.

public class CustomLayoutActivity extends Activity {

    public static boolean isCustomCardAcrivityvisible;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom_layout_activity);
    }

    @Override
    protected void onResume() {
        super.onResume();
        isCustomCardAcrivityvisible = true;
    }

    @Override
    protected void onPause() {
        super.onPause();
        isCustomCardAcrivityvisible = false;
    }
}

and if you're about to refresh your notification just do following check:

    if(!CustomLayoutActivity.isCustomCardAcrivityvisible) {
        updateNotification();
    }

Alternatively you can use setUsesChronometer(boolean b) method, to just display a timer (instead of contextText) that will be refreshed for you, but please notice that the timer will only be displayed (on Android Wear) if you will NOT set a custom layout to your card. So while this is not exactly what you want, you may consider this instead.

Show the when field as a stopwatch. Instead of presenting when as a timestamp, the notification will show an automatically updating display of the minutes and seconds since when. Useful when showing an elapsed time (like an ongoing phone call).

Upvotes: 1

Related Questions