diff options
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java')
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java | 194 |
1 files changed, 174 insertions, 20 deletions
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 b541416..4ac41fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -40,6 +40,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; +import android.content.res.ThemeConfig; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Bitmap; @@ -82,6 +83,7 @@ import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; +import android.util.Pair; import android.view.Display; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -92,8 +94,10 @@ import android.view.VelocityTracker; import android.view.View; import android.view.WindowManagerGlobal; import android.view.ViewConfiguration; +import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewStub; +import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; @@ -102,6 +106,7 @@ import android.view.animation.AccelerateInterpolator; 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.TextView; @@ -296,6 +301,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, Point mCurrentDisplaySize = new Point(); StatusBarWindowView mStatusBarWindow; + FrameLayout mStatusBarWindowContent; PhoneStatusBarView mStatusBarView; private int mStatusBarWindowState = WINDOW_STATE_SHOWING; private StatusBarWindowManager mStatusBarWindowManager; @@ -359,6 +365,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, int mInitialTouchX; int mInitialTouchY; + // last theme that was applied in order to detect theme change (as opposed + // to some other configuration change). + ThemeConfig mCurrentTheme; + private boolean mRecreating = false; + // for disabling the status bar int mDisabled1 = 0; int mDisabled2 = 0; @@ -708,6 +719,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mScrimSrcModeEnabled = mContext.getResources().getBoolean( R.bool.config_status_bar_scrim_behind_use_src); + ThemeConfig currentTheme = mContext.getResources().getConfiguration().themeConfig; + if (currentTheme != null) { + mCurrentTheme = (ThemeConfig)currentTheme.clone(); + } else { + mCurrentTheme = ThemeConfig.getSystemTheme(); + } + + mStatusBarWindow = new StatusBarWindowView(mContext, null); + mStatusBarWindow.setService(this); + super.start(); // calls createAndAddWindows() mMediaSessionManager @@ -776,10 +797,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateDisplaySize(); // populates mDisplayMetrics updateResources(); - mStatusBarWindow = (StatusBarWindowView) View.inflate(context, + mStatusBarWindowContent = (FrameLayout) View.inflate(context, R.layout.super_status_bar, null); mStatusBarWindow.setService(this); - mStatusBarWindow.setOnTouchListener(new View.OnTouchListener() { + mStatusBarWindowContent.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { checkUserAutohide(v, event); @@ -788,17 +809,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, animateCollapsePanels(); } } - return mStatusBarWindow.onTouchEvent(event); + return mStatusBarWindowContent.onTouchEvent(event); } }); - mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar); + mStatusBarView = (PhoneStatusBarView) mStatusBarWindowContent.findViewById(R.id.status_bar); mStatusBarView.setBar(this); - PanelHolder holder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder); + PanelHolder holder = (PanelHolder) mStatusBarWindowContent.findViewById(R.id.panel_holder); mStatusBarView.setPanelHolder(holder); - mNotificationPanel = (NotificationPanelView) mStatusBarWindow.findViewById( + mNotificationPanel = (NotificationPanelView) mStatusBarWindowContent.findViewById( R.id.notification_panel); mNotificationPanel.setStatusBar(this); @@ -824,9 +845,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, try { boolean showNav = mWindowManagerService.hasNavigationBar(); if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav); - if (showNav) { + if (showNav && !mRecreating) { mNavigationBarView = (NavigationBarView) View.inflate(context, R.layout.navigation_bar, null); + mNavigationBarView.updateResources(getNavbarThemedResources()); mNavigationBarView.setDisabledFlags(mDisabled1); mNavigationBarView.setBar(this); @@ -856,7 +878,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // figure out which pixel-format to use for the status bar. mPixelFormat = PixelFormat.OPAQUE; - mStackScroller = (NotificationStackScrollLayout) mStatusBarWindow.findViewById( + mStackScroller = (NotificationStackScrollLayout) mStatusBarWindowContent.findViewById( R.id.notification_stack_scroller); mStackScroller.setLongPressListener(getNotificationLongClicker()); mStackScroller.setPhoneStatusBar(this); @@ -889,13 +911,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mStackScroller.setDismissView(mDismissView); mExpandedContents = mStackScroller; - mBackdrop = (BackDropView) mStatusBarWindow.findViewById(R.id.backdrop); + mBackdrop = (BackDropView) mStatusBarWindowContent.findViewById(R.id.backdrop); mBackdropFront = (ImageView) mBackdrop.findViewById(R.id.backdrop_front); mBackdropBack = (ImageView) mBackdrop.findViewById(R.id.backdrop_back); - ScrimView scrimBehind = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_behind); - ScrimView scrimInFront = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_in_front); - View headsUpScrim = mStatusBarWindow.findViewById(R.id.heads_up_scrim); + ScrimView scrimBehind = (ScrimView) mStatusBarWindowContent.findViewById(R.id.scrim_behind); + ScrimView scrimInFront = (ScrimView) mStatusBarWindowContent.findViewById(R.id.scrim_in_front); + View headsUpScrim = mStatusBarWindowContent.findViewById(R.id.heads_up_scrim); mScrimController = new ScrimController(scrimBehind, scrimInFront, headsUpScrim, mScrimSrcModeEnabled); mHeadsUpManager.addListener(mScrimController); @@ -904,16 +926,16 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mStatusBarView.setScrimController(mScrimController); mDozeScrimController = new DozeScrimController(mScrimController, context); - mHeader = (StatusBarHeaderView) mStatusBarWindow.findViewById(R.id.header); + mHeader = (StatusBarHeaderView) mStatusBarWindowContent.findViewById(R.id.header); mHeader.setActivityStarter(this); - mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header); - mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view); + mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindowContent.findViewById(R.id.keyguard_header); + mKeyguardStatusView = mStatusBarWindowContent.findViewById(R.id.keyguard_status_view); mKeyguardBottomArea = - (KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area); + (KeyguardBottomAreaView) mStatusBarWindowContent.findViewById(R.id.keyguard_bottom_area); mKeyguardBottomArea.setActivityStarter(this); mKeyguardBottomArea.setAssistManager(mAssistManager); mKeyguardIndicationController = new KeyguardIndicationController(mContext, - (KeyguardIndicationTextView) mStatusBarWindow.findViewById( + (KeyguardIndicationTextView) mStatusBarWindowContent.findViewById( R.id.keyguard_indication_text)); mKeyguardBottomArea.setKeyguardIndicationController(mKeyguardIndicationController); @@ -992,12 +1014,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mWeatherController = new WeatherControllerImpl(mContext); mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext, - (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), + (ViewStub) mStatusBarWindowContent.findViewById(R.id.keyguard_user_switcher), mKeyguardStatusBar, mNotificationPanel, mUserSwitcherController); // Set up the quick settings tile panel - mQSPanel = (QSPanel) mStatusBarWindow.findViewById(R.id.quick_settings_panel); + mQSPanel = (QSPanel) mStatusBarWindowContent.findViewById(R.id.quick_settings_panel); if (mQSPanel != null) { final QSTileHost qsh = new QSTileHost(mContext, this, mBluetoothController, mLocationController, mRotationLockController, @@ -1007,7 +1029,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mSecurityController); mQSPanel.setHost(qsh); mQSPanel.setTiles(qsh.getTiles()); - mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow); + mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindowContent); mQSPanel.setBrightnessMirror(mBrightnessMirrorController); mHeader.setQSPanel(mQSPanel); qsh.setCallback(new QSTileHost.Callback() { @@ -1245,6 +1267,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + mNavigationBarView); if (mNavigationBarView == null) return; + ThemeConfig newTheme = mContext.getResources().getConfiguration().themeConfig; + if (newTheme != null && + (mCurrentTheme == null || !mCurrentTheme.equals(newTheme))) { + // Nevermind, this will be re-created + return; + } + prepareNavigationBarView(); mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams()); @@ -1292,6 +1321,18 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return lp; } + private Resources getNavbarThemedResources() { + String pkgName = mCurrentTheme.getOverlayPkgNameForApp(ThemeConfig.SYSTEMUI_NAVBAR_PKG); + Resources res = null; + try { + res = mContext.getPackageManager().getThemedResourcesForApplication( + mContext.getPackageName(), pkgName); + } catch (PackageManager.NameNotFoundException e) { + res = mContext.getResources(); + } + return res; + } + public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { mIconController.addSystemIcon(slot, index, viewIndex, icon); } @@ -1388,6 +1429,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mNavigationBarView != null) { mNavigationBarView.setLayoutDirection(layoutDirection); } + mIconController.refreshAllStatusBarIcons(); } private void updateNotificationShade() { @@ -3046,6 +3088,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private void addStatusBarWindow() { makeStatusBarView(); + mStatusBarWindow.addContent(mStatusBarWindowContent); mStatusBarWindowManager = new StatusBarWindowManager(mContext); mStatusBarWindowManager.add(mStatusBarWindow, getStatusBarHeight()); } @@ -3269,6 +3312,100 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mUserSetupObserver, mCurrentUserId); } + private static void copyNotifications(ArrayList<Pair<String, StatusBarNotification>> dest, + NotificationData source) { + int N = source.size(); + for (int i = 0; i < N; i++) { + NotificationData.Entry entry = source.get(i); + dest.add(Pair.create(entry.key, entry.notification)); + } + } + + private void recreateStatusBar() { + mRecreating = true; + + if (mNetworkController != null) { + mContext.unregisterReceiver(mNetworkController); + } + + mStatusBarWindow.removeContent(mStatusBarWindowContent); + mStatusBarWindow.clearDisappearingChildren(); + + RankingMap rankingMap = mNotificationData.getRankingMap(); + // extract icons from the soon-to-be recreated viewgroup. + /* + int nIcons = mStatusIcons != null ? mStatusIcons.getChildCount() : 0; + ArrayList<StatusBarIcon> icons = new ArrayList<StatusBarIcon>(nIcons); + ArrayList<String> iconSlots = new ArrayList<String>(nIcons); + for (int i = 0; i < nIcons; i++) { + StatusBarIconView iconView = (StatusBarIconView)mStatusIcons.getChildAt(i); + icons.add(iconView.getStatusBarIcon()); + iconSlots.add(iconView.getStatusBarSlot()); + } + */ + + removeAllViews(mStatusBarWindowContent); + + // extract notifications. + int nNotifs = mNotificationData.size(); + ArrayList<Pair<String, StatusBarNotification>> notifications = + new ArrayList<Pair<String, StatusBarNotification>>(nNotifs); + copyNotifications(notifications, mNotificationData); + mNotificationData.clear(); + + makeStatusBarView(); + repositionNavigationBar(); + if (mNavigationBarView != null) { + mNavigationBarView.updateResources(getNavbarThemedResources()); + } + + // recreate StatusBarIconViews. + /* + for (int i = 0; i < nIcons; i++) { + StatusBarIcon icon = icons.get(i); + String slot = iconSlots.get(i); + addIcon(slot, i, i, icon); + } + */ + + // recreate notifications. + for (int i = 0; i < nNotifs; i++) { + Pair<String, StatusBarNotification> notifData = notifications.get(i); + addNotificationViews(createNotificationViews(notifData.second), rankingMap); + } + mNotificationData.filterAndSort(); + + setAreThereNotifications(); + + mStatusBarWindow.addContent(mStatusBarWindowContent); + + checkBarModes(); + + // Stop the command queue until the new status bar container settles and has a layout pass + mCommandQueue.pause(); + mStatusBarWindow.requestLayout(); + mStatusBarWindow.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + mStatusBarWindow.getViewTreeObserver().removeOnGlobalLayoutListener(this); + mCommandQueue.resume(); + mRecreating = false; + } + }); + } + + private void removeAllViews(ViewGroup parent) { + int N = parent.getChildCount(); + for (int i = 0; i < N; i++) { + View child = parent.getChildAt(i); + if (child instanceof ViewGroup) { + removeAllViews((ViewGroup) child); + } + } + parent.removeAllViews(); + } + /** * Reload some of our resources when the configuration changes. * @@ -3277,6 +3414,19 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, * meantime, just update the things that we know change. */ void updateResources() { + final Context context = mContext; + final Resources res = context.getResources(); + + // detect theme change. + ThemeConfig newTheme = res.getConfiguration().themeConfig; + if (newTheme != null && + (mCurrentTheme == null || !mCurrentTheme.equals(newTheme))) { + mCurrentTheme = (ThemeConfig)newTheme.clone(); + recreateStatusBar(); + } else { + loadDimens(); + } + // Update the quick setting tiles if (mQSPanel != null) { mQSPanel.updateResources(); @@ -3290,6 +3440,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mBrightnessMirrorController != null) { mBrightnessMirrorController.updateResources(); } + + if (mNavigationBarView != null) { + mNavigationBarView.updateResources(getNavbarThemedResources()); + } } protected void loadDimens() { |