diff options
Diffstat (limited to 'packages')
18 files changed, 417 insertions, 49 deletions
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java index cc1e01a..055da3e 100644 --- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java +++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java @@ -189,6 +189,7 @@ public class DefaultContainerService extends IntentService { ret.recommendedInstallLocation = PackageHelper.resolveInstallLocation(context, pkg.packageName, pkg.installLocation, sizeBytes, flags); ret.multiArch = pkg.multiArch; + ret.isTheme = pkg.isTheme; return ret; } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index cd1546a..fac9507 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.res.ThemeConfig; import android.content.res.XmlResourceParser; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index e42ce66..7ef4db1 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -18,12 +18,14 @@ --> <!-- This is the combined status bar / notification panel window. --> -<com.android.systemui.statusbar.phone.StatusBarWindowView +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sysui="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true"> + android:focusable="true" + android:fitsSystemWindows="false" + android:descendantFocusability="afterDescendants"> <com.android.systemui.statusbar.BackDropView android:id="@+id/backdrop" @@ -97,4 +99,4 @@ sysui:ignoreRightInset="true" /> -</com.android.systemui.statusbar.phone.StatusBarWindowView> +</FrameLayout> diff --git a/packages/SystemUI/res/values/cm_colors.xml b/packages/SystemUI/res/values/cm_colors.xml new file mode 100644 index 0000000..54d1b98 --- /dev/null +++ b/packages/SystemUI/res/values/cm_colors.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 The CyanogenMod Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + + <!-- Color for the "No recent apps" text in the recent apps list. --> + <color name="no_recent_apps">#bebebe</color> + + <!-- Colors for the system bars --> + <color name="status_bar_background_opaque">@color/system_bar_background_opaque</color> + <color name="status_bar_background_semi_transparent"> + @color/system_bar_background_semi_transparent + </color> + <color name="status_bar_background_transparent">@color/system_bar_background_transparent</color> + <color name="navigation_bar_background_opaque">@color/system_bar_background_opaque</color> + <color name="navigation_bar_background_semi_transparent"> + @color/system_bar_background_semi_transparent + </color> + <color name="navigation_bar_background_transparent"> + @color/system_bar_background_transparent + </color> + +</resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 3b23f14..d90de92 100755 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -40,6 +40,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.ThemeConfig; import android.database.ContentObserver; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -1356,22 +1357,28 @@ public abstract class BaseStatusBar extends SystemUI implements View contentViewLocal = null; View bigContentViewLocal = null; View headsUpContentViewLocal = null; + final ThemeConfig themeConfig = mContext.getResources().getConfiguration().themeConfig; + String themePackageName = themeConfig != null ? + themeConfig.getOverlayPkgNameForApp(mContext.getPackageName()) : null; try { contentViewLocal = contentView.apply( sbn.getPackageContext(mContext), contentContainer, - mOnClickHandler); + mOnClickHandler, + themePackageName); if (bigContentView != null) { bigContentViewLocal = bigContentView.apply( sbn.getPackageContext(mContext), contentContainer, - mOnClickHandler); + mOnClickHandler, + themePackageName); } if (headsUpContentView != null) { headsUpContentViewLocal = headsUpContentView.apply( sbn.getPackageContext(mContext), contentContainer, - mOnClickHandler); + mOnClickHandler, + themePackageName); } } catch (RuntimeException e) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index a1b07b5..454b9a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -77,6 +77,7 @@ public class CommandQueue extends IStatusBar.Stub { private StatusBarIconList mList; private Callbacks mCallbacks; private Handler mHandler = new H(); + private boolean mPaused = false; /** * These methods are called back on the main thread. @@ -293,8 +294,20 @@ public class CommandQueue extends IStatusBar.Stub { } } + public void pause() { + mPaused = true; + } + + public void resume() { + mPaused = false; + } + private final class H extends Handler { public void handleMessage(Message msg) { + if (mPaused) { + this.sendMessageAtFrontOfQueue(Message.obtain(msg)); + return; + } final int what = msg.what & MSG_MASK; switch (what) { case MSG_ICON: { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index aedae52..c8c318b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -191,6 +191,14 @@ public class NotificationData { return mEntries.get(key); } + public Entry get(int i) { + return mEntries.valueAt(i); + } + + public RankingMap getRankingMap() { + return mRankingMap; + } + public void add(Entry entry, RankingMap ranking) { mEntries.put(entry.notification.getKey(), entry); updateRankingAndSort(ranking); @@ -288,6 +296,14 @@ public class NotificationData { return false; } + public void clear() { + mEntries.clear(); + } + + public int size() { + return mEntries.size(); + } + // Q: What kinds of notifications should show during setup? // A: Almost none! Only things coming from the system (package is "android") that also // have special "kind" tags marking them as relevant for setup (see below). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 7649bde..5a1c80e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar; import android.app.Notification; import android.content.Context; import android.content.res.Resources; +import android.content.res.ThemeConfig; import android.database.ContentObserver; import android.graphics.Canvas; import android.graphics.Paint; @@ -229,6 +230,10 @@ public class StatusBarIconView extends AnimatedImageView { } } + public String getStatusBarSlot() { + return mSlot; + } + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index 1601b83..093d18c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -57,15 +57,28 @@ public class BarTransitions { private int mMode; - public BarTransitions(View view, int gradientResourceId) { + public BarTransitions(View view, int gradientResourceId, int opaqueColorResourceId, + int semiTransparentColorResourceId, int transparentColorResourceId, + int warningColorResourceId) { mTag = "BarTransitions." + view.getClass().getSimpleName(); mView = view; - mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId); + mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId, + opaqueColorResourceId, semiTransparentColorResourceId, + transparentColorResourceId, warningColorResourceId); if (HIGH_END) { mView.setBackground(mBarBackground); } } + protected void setGradientResourceId(int gradientResourceId) { + mBarBackground.setGradientResourceId(mView.getContext().getResources(), + gradientResourceId); + } + + public void updateResources(Resources res) { + mBarBackground.updateResources(res); + } + public int getMode() { return mMode; } @@ -119,11 +132,11 @@ public class BarTransitions { } private static class BarBackgroundDrawable extends Drawable { - private final int mOpaque; - private final int mSemiTransparent; - private final int mTransparent; - private final int mWarning; - private final Drawable mGradient; + private int mOpaque; + private int mSemiTransparent; + private int mTransparent; + private int mWarning; + private Drawable mGradient; private final TimeInterpolator mInterpolator; private int mMode = -1; @@ -137,7 +150,15 @@ public class BarTransitions { private int mGradientAlphaStart; private int mColorStart; - public BarBackgroundDrawable(Context context, int gradientResourceId) { + private int mGradientResourceId; + private final int mOpaqueColorResourceId; + private final int mSemiTransparentColorResourceId; + private final int mTransparentColorResourceId; + private final int mWarningColorResourceId; + + public BarBackgroundDrawable(Context context, int gradientResourceId, + int opaqueColorResourceId, int semiTransparentColorResourceId, + int transparentColorResourceId, int warningColorResourceId) { final Resources res = context.getResources(); if (DEBUG_COLORS) { mOpaque = 0xff0000ff; @@ -145,13 +166,36 @@ public class BarTransitions { mTransparent = 0x2f0000ff; mWarning = 0xffff0000; } else { - mOpaque = context.getColor(R.color.system_bar_background_opaque); - mSemiTransparent = context.getColor(R.color.system_bar_background_semi_transparent); - mTransparent = context.getColor(R.color.system_bar_background_transparent); - mWarning = context.getColor(com.android.internal.R.color.battery_saver_mode_color); + mOpaque = res.getColor(R.color.system_bar_background_opaque); + mSemiTransparent = res.getColor(R.color.system_bar_background_semi_transparent); + mTransparent = res.getColor(transparentColorResourceId); + mWarning = res.getColor(warningColorResourceId); } mGradient = context.getDrawable(gradientResourceId); mInterpolator = new LinearInterpolator(); + mGradientResourceId = gradientResourceId; + mOpaqueColorResourceId = opaqueColorResourceId; + mSemiTransparentColorResourceId = semiTransparentColorResourceId; + mTransparentColorResourceId = transparentColorResourceId; + mWarningColorResourceId = warningColorResourceId; + } + + public void setGradientResourceId(Resources res, int gradientResourceId) { + mGradient = res.getDrawable(gradientResourceId); + mGradientResourceId = gradientResourceId; + } + + public void updateResources(Resources res) { + mOpaque = res.getColor(mOpaqueColorResourceId); + mSemiTransparent = res.getColor(mSemiTransparentColorResourceId); + mTransparent = res.getColor(mTransparentColorResourceId); + mWarning = res.getColor(mWarningColorResourceId); + // Retrieve the current bounds for mGradient so they can be set to + // the new drawable being loaded, otherwise the bounds will be (0, 0, 0, 0) + // and the gradient will not be drawn. + Rect bounds = mGradient.getBounds(); + mGradient = res.getDrawable(mGradientResourceId); + mGradient.setBounds(bounds); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java index 134c579..50656ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java @@ -35,7 +35,10 @@ public final class NavigationBarTransitions extends BarTransitions { private boolean mLightsOut; public NavigationBarTransitions(NavigationBarView view) { - super(view, R.drawable.nav_background); + super(view, R.drawable.nav_background, R.color.navigation_bar_background_opaque, + R.color.navigation_bar_background_semi_transparent, + R.color.navigation_bar_background_transparent, + com.android.internal.R.color.battery_saver_mode_color); mView = view; mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 6c6e207..dd86bd2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -78,6 +78,7 @@ public class NavigationBarView extends LinearLayout { private BackButtonDrawable mBackIcon, mBackLandIcon; private Drawable mRecentIcon; private Drawable mRecentLandIcon; + private Drawable mHomeIcon, mHomeLandIcon; private NavigationBarViewTaskSwitchHelper mTaskSwitchHelper; private DeadZone mDeadZone; @@ -90,6 +91,8 @@ public class NavigationBarView extends LinearLayout { // performs manual animation in sync with layout transitions private final NavTransitionListener mTransitionListener = new NavTransitionListener(); + private Resources mThemedResources; + private OnVerticalChangedListener mOnVerticalChangedListener; private boolean mIsLayoutRtl; private boolean mLayoutTransitionsEnabled; @@ -260,11 +263,44 @@ public class NavigationBarView extends LinearLayout { mBackLandIcon = new BackButtonDrawable(res.getDrawable(R.drawable.ic_sysbar_back_land)); mRecentIcon = res.getDrawable(R.drawable.ic_sysbar_recent); mRecentLandIcon = res.getDrawable(R.drawable.ic_sysbar_recent_land); + mHomeIcon = res.getDrawable(R.drawable.ic_sysbar_home); + mHomeLandIcon = res.getDrawable(R.drawable.ic_sysbar_home_land); + } + + public void updateResources(Resources res) { + mThemedResources = res; + getIcons(mThemedResources); + mBarTransitions.updateResources(res); + for (int i = 0; i < mRotatedViews.length; i++) { + ViewGroup container = (ViewGroup) mRotatedViews[i]; + if (container != null) { + updateLightsOutResources(container); + } + } + } + + private void updateLightsOutResources(ViewGroup container) { + ViewGroup lightsOut = (ViewGroup) container.findViewById(R.id.lights_out); + if (lightsOut != null) { + final int nChildren = lightsOut.getChildCount(); + for (int i = 0; i < nChildren; i++) { + final View child = lightsOut.getChildAt(i); + if (child instanceof ImageView) { + final ImageView iv = (ImageView) child; + // clear out the existing drawable, this is required since the + // ImageView keeps track of the resource ID and if it is the same + // it will not update the drawable. + iv.setImageDrawable(null); + iv.setImageDrawable(mThemedResources.getDrawable( + R.drawable.ic_sysbar_lights_out_dot_large)); + } + } + } } @Override public void setLayoutDirection(int layoutDirection) { - getIcons(getContext().getResources()); + getIcons(mThemedResources != null ? mThemedResources : getContext().getResources()); super.setLayoutDirection(layoutDirection); } @@ -298,13 +334,13 @@ public class NavigationBarView extends LinearLayout { mBackIcon.setImeVisible(backAlt); ((ImageView)getRecentsButton()).setImageDrawable(mVertical ? mRecentLandIcon : mRecentIcon); + ((ImageView)getHomeButton()).setImageDrawable(mVertical ? mHomeLandIcon : mHomeIcon); final boolean showImeButton = ((hints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); getImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE); // Update menu button in case the IME state has changed. setMenuVisibility(mShowMenu, true); - setDisabledFlags(mDisabledFlags, true); } 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() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java index fb1addf..bb3095e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java @@ -36,7 +36,10 @@ public final class PhoneStatusBarTransitions extends BarTransitions { private Animator mCurrentAnimation; public PhoneStatusBarTransitions(PhoneStatusBarView view) { - super(view, R.drawable.status_background); + super(view, R.drawable.status_background, R.color.status_bar_background_opaque, + R.color.status_bar_background_semi_transparent, + R.color.status_bar_background_transparent, + com.android.internal.R.color.battery_saver_mode_color); mView = view; final Resources res = mView.getContext().getResources(); mIconAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 067e50e..7f73c8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -460,4 +460,20 @@ public class StatusBarIconController implements Tunable { } return ret; } + + 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(); + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index 038fefb..48a8886 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -69,7 +69,6 @@ public class StatusBarWindowManager { * @param barHeight The height of the status bar in collapsed state. */ public void add(View statusBarView, int barHeight) { - // Now that the status bar window encompasses the sliding panel and its // translucent backdrop, the entire thing is made TRANSLUCENT and is // hardware-accelerated. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index f54f1fd..da5d056 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -34,6 +34,7 @@ import android.os.IPowerManager; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.PowerManager; import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; @@ -46,7 +47,6 @@ import android.view.ViewRootImpl; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.widget.FrameLayout; - import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.DragDownHelper; @@ -336,6 +336,20 @@ public class StatusBarWindowView extends FrameLayout { } } + public void addContent(View content) { + addView(content); + mStackScrollLayout = (NotificationStackScrollLayout) content.findViewById( + R.id.notification_stack_scroller); + mNotificationPanel = (NotificationPanelView) content.findViewById(R.id.notification_panel); + mDragDownHelper = new DragDownHelper(getContext(), this, mStackScrollLayout, mService); + mBrightnessMirror = content.findViewById(R.id.brightness_mirror); + + } + + public void removeContent(View content) { + removeView(content); + } + public class LayoutParams extends FrameLayout.LayoutParams { public boolean ignoreRightInset; @@ -361,8 +375,8 @@ public class StatusBarWindowView extends FrameLayout { void observe() { ContentResolver resolver = mContext.getContentResolver(); - resolver.registerContentObserver(Settings.System.getUriFor( - Settings.System.DOUBLE_TAP_SLEEP_GESTURE), false, this); + resolver.registerContentObserver(Settings.System.getUriFor(Settings.System.DOUBLE_TAP_SLEEP_GESTURE), false, + this); update(); } @@ -383,8 +397,8 @@ public class StatusBarWindowView extends FrameLayout { public void update() { ContentResolver resolver = mContext.getContentResolver(); - mDoubleTapToSleepEnabled = Settings.System.getInt( - resolver, Settings.System.DOUBLE_TAP_SLEEP_GESTURE, 1) == 1; + mDoubleTapToSleepEnabled = Settings.System + .getInt(resolver, Settings.System.DOUBLE_TAP_SLEEP_GESTURE, 1) == 1; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java index 0340984..1ccf80b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java @@ -38,7 +38,7 @@ public class BrightnessMirrorController { private final View mPanelHolder; private final int[] mInt2Cache = new int[2]; - public BrightnessMirrorController(StatusBarWindowView statusBarWindow) { + public BrightnessMirrorController(View statusBarWindow) { mScrimBehind = (ScrimView) statusBarWindow.findViewById(R.id.scrim_behind); mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror); mPanelHolder = statusBarWindow.findViewById(R.id.panel_holder); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java index 2688813..998959f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java @@ -27,6 +27,7 @@ import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; +import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.media.AudioManager; import android.media.session.MediaSessionManager; @@ -63,6 +64,8 @@ public class VolumeUI extends SystemUI { private VolumeDialogComponent mVolumeComponent; + private Configuration mConfiguration; + @Override public void start() { mEnabled = mContext.getResources().getBoolean(R.bool.enable_volume_ui); @@ -80,6 +83,7 @@ public class VolumeUI extends SystemUI { mContext, Settings.Secure.VOLUME_CONTROLLER_SERVICE_COMPONENT, new ServiceMonitorCallbacks()); mVolumeControllerService.start(); + mConfiguration = new Configuration(mContext.getResources().getConfiguration()); } private VolumeComponent getVolumeComponent() { @@ -91,6 +95,20 @@ public class VolumeUI extends SystemUI { super.onConfigurationChanged(newConfig); if (!mEnabled) return; getVolumeComponent().onConfigurationChanged(newConfig); + + if (isThemeChange(newConfig)) { + // TODO: implement initPanel() if needed + //initPanel(); + } + mConfiguration.setTo(newConfig); + } + + private boolean isThemeChange(Configuration newConfig) { + if (mConfiguration != null) { + int changes = mConfiguration.updateFrom(newConfig); + return (changes & ActivityInfo.CONFIG_THEME_RESOURCE) != 0; + } + return false; } @Override |