diff options
| -rw-r--r-- | services/core/java/com/android/server/am/PreBootBroadcaster.java | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/PreBootBroadcaster.java b/services/core/java/com/android/server/am/PreBootBroadcaster.java index 1f3ccf530f71..3ed3d9a29c69 100644 --- a/services/core/java/com/android/server/am/PreBootBroadcaster.java +++ b/services/core/java/com/android/server/am/PreBootBroadcaster.java @@ -19,17 +19,23 @@ package com.android.server.am; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import android.app.AppOpsManager; +import android.app.Notification; +import android.app.NotificationManager; import android.content.ComponentName; +import android.content.Context; import android.content.IIntentReceiver; import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.os.Process; import android.os.UserHandle; import android.util.Slog; import com.android.internal.R; import com.android.internal.util.ProgressReporter; +import com.android.server.UiThread; import java.util.List; @@ -61,16 +67,20 @@ public abstract class PreBootBroadcaster extends IIntentReceiver.Stub { mTargets = mService.mContext.getPackageManager().queryBroadcastReceiversAsUser(mIntent, MATCH_SYSTEM_ONLY, UserHandle.of(userId)); + + mHandler.obtainMessage(MSG_SHOW).sendToTarget(); } public void sendNext() { if (mIndex >= mTargets.size()) { + mHandler.obtainMessage(MSG_HIDE).sendToTarget(); onFinished(); return; } if (!mService.isUserRunning(mUserId, 0)) { Slog.i(TAG, "User " + mUserId + " is no longer running; skipping remaining receivers"); + mHandler.obtainMessage(MSG_HIDE).sendToTarget(); onFinished(); return; } @@ -100,5 +110,44 @@ public abstract class PreBootBroadcaster extends IIntentReceiver.Stub { sendNext(); } + private static final int MSG_SHOW = 1; + private static final int MSG_HIDE = 2; + + private Handler mHandler = new Handler(UiThread.get().getLooper(), null, true) { + @Override + public void handleMessage(Message msg) { + final Context context = mService.mContext; + final NotificationManager notifManager = context + .getSystemService(NotificationManager.class); + + switch (msg.what) { + case MSG_SHOW: + final CharSequence title = context + .getText(R.string.android_upgrading_notification_title); + final CharSequence message = context + .getText(R.string.android_upgrading_notification_body); + final Notification notif = new Notification.Builder(mService.mContext) + .setSmallIcon(R.drawable.stat_sys_adb) + .setWhen(0) + .setOngoing(true) + .setTicker(title) + .setDefaults(0) + .setPriority(Notification.PRIORITY_MAX) + .setColor(context.getColor( + com.android.internal.R.color.system_notification_accent_color)) + .setContentTitle(title) + .setContentText(message) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .build(); + notifManager.notifyAsUser(TAG, 0, notif, UserHandle.of(mUserId)); + break; + + case MSG_HIDE: + notifManager.cancelAsUser(TAG, 0, UserHandle.of(mUserId)); + break; + } + } + }; + public abstract void onFinished(); } |