diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index eaec8fab271d0..dda52d42d302b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -507,7 +507,6 @@ public abstract class BaseStatusBar extends SystemUI implements ServiceManager.checkService(DreamService.DREAM_SERVICE)); mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - mSettingsObserver.onChange(false); // set up mContext.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), true, mSettingsObserver); @@ -557,6 +556,7 @@ public abstract class BaseStatusBar extends SystemUI implements createAndAddWindows(); + mSettingsObserver.onChange(false); // set up disable(switches[0], false /* animate */); setSystemUiVisibility(switches[1], 0xffffffff); topAppWindowChanged(switches[2] != 0); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 20dd3e7e1e195..d02cd17a497d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -147,6 +147,9 @@ public class StatusBarIconView extends AnimatedImageView { } private boolean updateDrawable(boolean withClear) { + if (mIcon == null) { + return false; + } Drawable drawable = getIcon(mIcon); if (drawable == null) { Log.w(TAG, "No icon for slot " + mSlot); @@ -225,6 +228,12 @@ public class StatusBarIconView extends AnimatedImageView { } } + @Override + public void onRtlPropertiesChanged(int layoutDirection) { + super.onRtlPropertiesChanged(layoutDirection); + updateDrawable(); + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); 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 d28644123607b..4ffe9b188fb07 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -32,7 +32,6 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.TimeInterpolator; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -82,14 +81,12 @@ import android.provider.Settings; import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; -import android.text.TextUtils; import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; import android.view.Display; import android.view.Gravity; -import android.view.HardwareCanvas; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -97,23 +94,17 @@ import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; -import android.view.ViewPropertyAnimator; import android.view.ViewStub; -import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; -import android.view.animation.Animation; import android.view.animation.AnimationUtils; -import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.view.animation.PathInterpolator; -import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.statusbar.StatusBarIcon; @@ -172,7 +163,6 @@ import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout.OnChildLocationsChangedListener; -import com.android.systemui.statusbar.stack.StackScrollAlgorithm; import com.android.systemui.statusbar.stack.StackScrollState.ViewState; import com.android.systemui.volume.VolumeComponent; @@ -212,9 +202,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private static final boolean CLOSE_PANEL_WHEN_EMPTIED = true; - private static final int NOTIFICATION_PRIORITY_MULTIPLIER = 10; // see NotificationManagerService - private static final int HIDE_ICONS_BELOW_SCORE = Notification.PRIORITY_LOW * NOTIFICATION_PRIORITY_MULTIPLIER; - private static final int STATUS_OR_NAV_TRANSIENT = View.STATUS_BAR_TRANSIENT | View.NAVIGATION_BAR_TRANSIENT; private static final long AUTOHIDE_TIMEOUT_MS = 3000; @@ -261,8 +248,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, AccessibilityController mAccessibilityController; int mNaturalBarHeight = -1; - int mIconSize = -1; - int mIconHPadding = -1; + Display mDisplay; Point mCurrentDisplaySize = new Point(); @@ -278,23 +264,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, int mPixelFormat; Object mQueueLock = new Object(); - // viewgroup containing the normal contents of the statusbar - LinearLayout mStatusBarContents; - - // right-hand icons - LinearLayout mSystemIconArea; - LinearLayout mSystemIcons; - - // left-hand icons - LinearLayout mStatusIcons; - LinearLayout mStatusIconsKeyguard; - - // the icons themselves - IconMerger mNotificationIcons; - View mNotificationIconArea; - - // [+> - View mMoreIcon; + StatusBarIconController mIconController; // expanded notifications NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window @@ -419,7 +389,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private boolean mDozing; private boolean mScrimSrcModeEnabled; - private Interpolator mLinearOutSlowIn; private Interpolator mLinearInterpolator = new LinearInterpolator(); private Interpolator mBackdropInterpolator = new AccelerateDecelerateInterpolator(); public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); @@ -610,8 +579,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateDisplaySize(); // populates mDisplayMetrics updateResources(); - mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); - mStatusBarWindow = (StatusBarWindowView) View.inflate(context, R.layout.super_status_bar, null); mStatusBarWindow.mService = this; @@ -689,15 +656,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // figure out which pixel-format to use for the status bar. mPixelFormat = PixelFormat.OPAQUE; - mSystemIconArea = (LinearLayout) mStatusBarView.findViewById(R.id.system_icon_area); - mSystemIcons = (LinearLayout) mStatusBarView.findViewById(R.id.system_icons); - mStatusIcons = (LinearLayout)mStatusBarView.findViewById(R.id.statusIcons); - mNotificationIconArea = mStatusBarView.findViewById(R.id.notification_icon_area_inner); - mNotificationIcons = (IconMerger)mStatusBarView.findViewById(R.id.notificationIcons); - mMoreIcon = mStatusBarView.findViewById(R.id.moreIcon); - mNotificationIcons.setOverflowIndicator(mMoreIcon); - mStatusBarContents = (LinearLayout)mStatusBarView.findViewById(R.id.status_bar_contents); - mStackScroller = (NotificationStackScrollLayout) mStatusBarWindow.findViewById( R.id.notification_stack_scroller); mStackScroller.setLongPressListener(getNotificationLongClicker()); @@ -741,7 +699,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mHeader = (StatusBarHeaderView) mStatusBarWindow.findViewById(R.id.header); mHeader.setActivityStarter(this); mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header); - mStatusIconsKeyguard = (LinearLayout) mKeyguardStatusBar.findViewById(R.id.statusIcons); mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view); mKeyguardBottomArea = (KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area); @@ -756,6 +713,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // set the inital view visibility setAreThereNotifications(); + mIconController = new StatusBarIconController( + mContext, mStatusBarView, mKeyguardStatusBar, this); + // Background thread for any controllers that need it. mHandlerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND); mHandlerThread.start(); @@ -1177,49 +1137,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mWindowManager.removeView(mHeadsUpNotificationView); } - public void refreshAllStatusBarIcons() { - refreshAllIconsForLayout(mStatusIcons); - refreshAllIconsForLayout(mStatusIconsKeyguard); - refreshAllIconsForLayout(mNotificationIcons); - } - - private void refreshAllIconsForLayout(LinearLayout ll) { - final int count = ll.getChildCount(); - for (int n = 0; n < count; n++) { - View child = ll.getChildAt(n); - if (child instanceof StatusBarIconView) { - ((StatusBarIconView) child).updateDrawable(); - } - } - } - public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { - if (SPEW) Log.d(TAG, "addIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex - + " icon=" + icon); - StatusBarIconView view = new StatusBarIconView(mContext, slot, null); - view.set(icon); - mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams( - LayoutParams.WRAP_CONTENT, mIconSize)); - view = new StatusBarIconView(mContext, slot, null); - view.set(icon); - mStatusIconsKeyguard.addView(view, viewIndex, new LinearLayout.LayoutParams( - LayoutParams.WRAP_CONTENT, mIconSize)); + mIconController.addSystemIcon(slot, index, viewIndex, icon); } public void updateIcon(String slot, int index, int viewIndex, StatusBarIcon old, StatusBarIcon icon) { - if (SPEW) Log.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex - + " old=" + old + " icon=" + icon); - StatusBarIconView view = (StatusBarIconView) mStatusIcons.getChildAt(viewIndex); - view.set(icon); - view = (StatusBarIconView) mStatusIconsKeyguard.getChildAt(viewIndex); - view.set(icon); + mIconController.updateSystemIcon(slot, index, viewIndex, old, icon); } public void removeIcon(String slot, int index, int viewIndex) { - if (SPEW) Log.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex); - mStatusIcons.removeViewAt(viewIndex); - mStatusIconsKeyguard.removeViewAt(viewIndex); + mIconController.removeSystemIcon(slot, index, viewIndex); } public UserHandle getCurrentUserHandle() { @@ -1339,7 +1267,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mNavigationBarView != null) { mNavigationBarView.setLayoutDirection(layoutDirection); } - refreshAllStatusBarIcons(); } private void updateShowSearchHoldoff() { @@ -1480,69 +1407,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, @Override protected void updateNotifications() { - // TODO: Move this into updateNotificationIcons()? - if (mNotificationIcons == null) return; - mNotificationData.filterAndSort(); updateNotificationShade(); - updateNotificationIcons(); - } - - private void updateNotificationIcons() { - final LinearLayout.LayoutParams params - = new LinearLayout.LayoutParams(mIconSize + 2*mIconHPadding, mNaturalBarHeight); - - ArrayList activeNotifications = mNotificationData.getActiveNotifications(); - final int N = activeNotifications.size(); - ArrayList toShow = new ArrayList<>(N); - - // Filter out notifications with low scores. - for (int i = 0; i < N; i++) { - Entry ent = activeNotifications.get(i); - if (ent.notification.getScore() < HIDE_ICONS_BELOW_SCORE && - !NotificationData.showNotificationEvenIfUnprovisioned(ent.notification)) { - continue; - } - toShow.add(ent.icon); - } - - if (DEBUG) { - Log.d(TAG, "refreshing icons: " + toShow.size() + - " notifications, mNotificationIcons=" + mNotificationIcons); - } - - ArrayList toRemove = new ArrayList(); - for (int i=0; i activeNotifications = + notificationData.getActiveNotifications(); + final int N = activeNotifications.size(); + ArrayList toShow = new ArrayList<>(N); + + // Filter out ambient notifications. + for (int i = 0; i < N; i++) { + NotificationData.Entry ent = activeNotifications.get(i); + if (notificationData.isAmbient(ent.key) + && !NotificationData.showNotificationEvenIfUnprovisioned(ent.notification)) { + continue; + } + toShow.add(ent.icon); + } + + ArrayList toRemove = new ArrayList<>(); + for (int i=0; i