diff --git a/core/java/com/android/internal/statusbar/StatusBarNotification.java b/core/java/com/android/internal/statusbar/StatusBarNotification.java index d443523a2c124..540d134937e83 100644 --- a/core/java/com/android/internal/statusbar/StatusBarNotification.java +++ b/core/java/com/android/internal/statusbar/StatusBarNotification.java @@ -19,6 +19,7 @@ package com.android.internal.statusbar; import android.app.Notification; import android.os.Parcel; import android.os.Parcelable; +import android.os.UserId; import android.widget.RemoteViews; @@ -132,6 +133,11 @@ public class StatusBarNotification implements Parcelable { return ((notification.flags & Notification.FLAG_ONGOING_EVENT) == 0) && ((notification.flags & Notification.FLAG_NO_CLEAR) == 0); } + + /** Returns a userHandle for the instance of the app that posted this notification. */ + public int getUserId() { + return UserId.getUserId(this.uid); + } } diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 51dc3b177954b..676bfd0633844 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -15,6 +15,8 @@ + + diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index 7f598b67fb0c8..60896c3b743a5 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -65,11 +65,24 @@ android:layout_weight="1" /> + + - \ No newline at end of file + /> + diff --git a/packages/SystemUI/res/layout/status_bar_notification_row.xml b/packages/SystemUI/res/layout/status_bar_notification_row.xml index dd701663848db..3dcdae8c0b6a8 100644 --- a/packages/SystemUI/res/layout/status_bar_notification_row.xml +++ b/packages/SystemUI/res/layout/status_bar_notification_row.xml @@ -49,4 +49,17 @@ android:background="@drawable/bottom_divider_glow" /> + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index ea5089d0f6668..c9c775353ba39 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -34,8 +34,10 @@ import android.app.ActivityManagerNative; import android.app.KeyguardManager; import android.app.PendingIntent; import android.app.TaskStackBuilder; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.database.ContentObserver; @@ -47,6 +49,7 @@ import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserId; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; @@ -65,6 +68,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupMenu; import android.widget.RemoteViews; +import android.widget.TextView; import java.util.ArrayList; @@ -72,6 +76,7 @@ public abstract class BaseStatusBar extends SystemUI implements CommandQueue.Callbacks, RecentsPanelView.OnRecentsPanelVisibilityChangedListener { static final String TAG = "StatusBar"; private static final boolean DEBUG = false; + public static final boolean MULTIUSER_DEBUG = false; protected static final int MSG_OPEN_RECENTS_PANEL = 1020; protected static final int MSG_CLOSE_RECENTS_PANEL = 1021; @@ -112,6 +117,8 @@ public abstract class BaseStatusBar extends SystemUI implements protected PopupMenu mNotificationBlamePopup; + protected int mCurrentUserId = 0; + // UI-specific methods /** @@ -252,6 +259,40 @@ public abstract class BaseStatusBar extends SystemUI implements switches[3] )); } + + // XXX: this is currently broken and will always return 0, but should start working at some point + try { + mCurrentUserId = ActivityManagerNative.getDefault().getCurrentUser().id; + } catch (RemoteException e) { + Log.v(TAG, "Couldn't get current user ID; guessing it's 0", e); + } + + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_SWITCHED); + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_USER_SWITCHED.equals(action)) { + mCurrentUserId = intent.getIntExtra(Intent.EXTRA_USERID, -1); + if (true) Slog.v(TAG, "userId " + mCurrentUserId + " is in the house"); + userSwitched(mCurrentUserId); + } + }}, filter); + } + + public void userSwitched(int newUserId) { + // should be overridden + } + + public boolean notificationIsForCurrentUser(StatusBarNotification n) { + final int thisUserId = mCurrentUserId; + final int notificationUserId = n.getUserId(); + if (DEBUG && MULTIUSER_DEBUG) { + Slog.v(TAG, String.format("%s: current userid: %d, notification userid: %d", + n, thisUserId, notificationUserId)); + } + return thisUserId == notificationUserId; } protected View updateNotificationVetoButton(View row, StatusBarNotification n) { @@ -604,6 +645,14 @@ public abstract class BaseStatusBar extends SystemUI implements applyLegacyRowBackground(sbn, content); row.setTag(R.id.expandable_tag, Boolean.valueOf(large != null)); + + if (MULTIUSER_DEBUG) { + TextView debug = (TextView) row.findViewById(R.id.debug_info); + if (debug != null) { + debug.setVisibility(View.VISIBLE); + debug.setText("U " + entry.notification.getUserId()); + } + } entry.row = row; entry.content = content; entry.expanded = expandedOneU; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 4d4adcb85a598..4ce4e293790ef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -174,6 +174,7 @@ public class PhoneStatusBar extends BaseStatusBar { int mNotificationPanelMarginBottomPx, mNotificationPanelMarginPx; int mNotificationPanelMinHeight; boolean mNotificationPanelIsFullScreenWidth; + TextView mNotificationPanelDebugText; // settings PanelView mSettingsPanel; @@ -343,6 +344,10 @@ public class PhoneStatusBar extends BaseStatusBar { mIntruderAlertView.setVisibility(View.GONE); mIntruderAlertView.setBar(this); } + if (MULTIUSER_DEBUG) { + mNotificationPanelDebugText = (TextView) mNotificationPanel.findViewById(R.id.header_debug_info); + mNotificationPanelDebugText.setVisibility(View.VISIBLE); + } updateShowSearchHoldoff(); @@ -806,9 +811,9 @@ public class PhoneStatusBar extends BaseStatusBar { // If the device hasn't been through Setup, we only show system notifications for (int i=0; i toRemove = new ArrayList(); @@ -854,10 +859,10 @@ public class PhoneStatusBar extends BaseStatusBar { // If the device hasn't been through Setup, we only show system notifications for (int i=0; i= HIDE_ICONS_BELOW_SCORE) - || showNotificationEvenIfUnprovisioned(ent.notification)) { - toShow.add(ent.icon); - } + if (!((provisioned && ent.notification.score >= HIDE_ICONS_BELOW_SCORE) + || showNotificationEvenIfUnprovisioned(ent.notification))) continue; + if (!notificationIsForCurrentUser(ent.notification)) continue; + toShow.add(ent.icon); } ArrayList toRemove = new ArrayList(); @@ -1789,6 +1794,7 @@ public class PhoneStatusBar extends BaseStatusBar { private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { + Slog.v(TAG, "onReceive: " + intent); String action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { int flags = CommandQueue.FLAG_EXCLUDE_NONE; @@ -1812,6 +1818,13 @@ public class PhoneStatusBar extends BaseStatusBar { } }; + @Override + public void userSwitched(int newUserId) { + if (MULTIUSER_DEBUG) mNotificationPanelDebugText.setText("USER " + newUserId); + animateCollapse(); + updateNotificationIcons(); + } + private void setIntruderAlertVisibility(boolean vis) { if (!ENABLE_INTRUDERS) return; if (DEBUG) {