Merge "Refactoring for better extendability"
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index bc18221..2ea8c9c 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -13,6 +13,7 @@
-keep class com.android.systemui.statusbar.car.CarStatusBar
-keep class com.android.systemui.statusbar.phone.PhoneStatusBar
-keep class com.android.systemui.statusbar.tv.TvStatusBar
+-keep class com.android.systemui.SystemUIFactory
-keepclassmembers class ** {
public void onBusEvent(**);
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 916e497..e98ec82 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -282,5 +282,8 @@
<!-- Whether to show the full screen user switcher. -->
<bool name="config_enableFullscreenUserSwitcher">false</bool>
+ <!-- SystemUIFactory component -->
+ <string name="config_systemUIFactoryComponent" translatable="false">com.android.systemui.SystemUIFactory</string>
+
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 1a9b874..3fb5f18 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -300,7 +300,7 @@
<dimen name="swipe_helper_falsing_threshold">70dp</dimen>
<dimen name="notifications_top_padding">4dp</dimen>
-
+
<!-- Minimum distance the user has to drag down to go to the full shade. -->
<dimen name="keyguard_drag_down_min_distance">100dp</dimen>
@@ -511,7 +511,7 @@
<!-- The maximum width of the navigation bar ripples. -->
<dimen name="key_button_ripple_max_width">95dp</dimen>
-
+
<!-- Inset shadow for FakeShadowDrawable. It is used to avoid gaps between the card
and the shadow. -->
<dimen name="fake_shadow_inset">1dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c600a1f..de49677 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -3,16 +3,16 @@
/**
* Copyright (c) 2009, The Android Open Source 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
+ * 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
+ * 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
+ * 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.
*/
-->
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 19e299254..2d056bf 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -80,6 +80,8 @@
// the theme set there.
setTheme(R.style.systemui_theme);
+ SystemUIFactory.createFromConfig(this);
+
if (Process.myUserHandle().equals(UserHandle.SYSTEM)) {
IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
new file mode 100644
index 0000000..681b39e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2016 The Android Open Source 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
+ */
+
+package com.android.systemui;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.ViewGroup;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.statusbar.phone.KeyguardBouncer;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.StatusBarWindowManager;
+
+/**
+ * Class factory to provide customizable SystemUI components.
+ */
+public class SystemUIFactory {
+ private static final String TAG = "SystemUIFactory";
+
+ static SystemUIFactory mFactory;
+
+ public static SystemUIFactory getInstance() {
+ return mFactory;
+ }
+
+ public static void createFromConfig(Context context) {
+ final String clsName = context.getString(R.string.config_systemUIFactoryComponent);
+ if (clsName == null || clsName.length() == 0) {
+ throw new RuntimeException("No SystemUIFactory component configured");
+ }
+
+ try {
+ Class<?> cls = null;
+ cls = context.getClassLoader().loadClass(clsName);
+ mFactory = (SystemUIFactory) cls.newInstance();
+ } catch (Throwable t) {
+ Log.w(TAG, "Error creating SystemUIFactory component: " + clsName, t);
+ throw new RuntimeException(t);
+ }
+ }
+
+ public SystemUIFactory() {}
+
+ public StatusBarKeyguardViewManager createStatusBarKeyguardViewManager(Context context,
+ ViewMediatorCallback viewMediatorCallback, LockPatternUtils lockPatternUtils) {
+ return new StatusBarKeyguardViewManager(context, viewMediatorCallback, lockPatternUtils);
+ }
+
+ public KeyguardBouncer createKeyguardBouncer(Context context, ViewMediatorCallback callback,
+ LockPatternUtils lockPatternUtils, StatusBarWindowManager windowManager,
+ ViewGroup container) {
+ return new KeyguardBouncer(context, callback, lockPatternUtils, windowManager, container);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index ed29a8f..9a00b4b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -69,6 +69,7 @@
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.SystemUI;
+import com.android.systemui.SystemUIFactory;
import com.android.systemui.classifier.FalsingManager;
import com.android.systemui.statusbar.phone.FingerprintUnlockController;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
@@ -591,8 +592,9 @@
updateInputRestrictedLocked();
mTrustManager.reportKeyguardShowingChanged();
- mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager(mContext,
- mViewMediatorCallback, mLockPatternUtils);
+ mStatusBarKeyguardViewManager =
+ SystemUIFactory.getInstance().createStatusBarKeyguardViewManager(mContext,
+ mViewMediatorCallback, mLockPatternUtils);
final ContentResolver cr = mContext.getContentResolver();
mDeviceInteractive = mPM.isInteractive();
@@ -1736,10 +1738,15 @@
public void onActivityDrawn() {
mHandler.sendEmptyMessage(ON_ACTIVITY_DRAWN);
}
+
public ViewMediatorCallback getViewMediatorCallback() {
return mViewMediatorCallback;
}
+ public LockPatternUtils getLockPatternUtils() {
+ return mLockPatternUtils;
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.print(" mSystemReady: "); pw.println(mSystemReady);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 99436a1..347ba3d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -41,13 +41,13 @@
*/
public class KeyguardBouncer {
- private Context mContext;
- private ViewMediatorCallback mCallback;
- private LockPatternUtils mLockPatternUtils;
- private ViewGroup mContainer;
+ protected Context mContext;
+ protected ViewMediatorCallback mCallback;
+ protected LockPatternUtils mLockPatternUtils;
+ protected ViewGroup mContainer;
private StatusBarWindowManager mWindowManager;
- private KeyguardHostView mKeyguardView;
- private ViewGroup mRoot;
+ protected KeyguardHostView mKeyguardView;
+ protected ViewGroup mRoot;
private boolean mShowingSoon;
private int mBouncerPromptReason;
private FalsingManager mFalsingManager;
@@ -134,7 +134,7 @@
public void hide(boolean destroyView) {
mFalsingManager.onBouncerHidden();
cancelShowRunnable();
- if (mKeyguardView != null) {
+ if (mKeyguardView != null) {
mKeyguardView.cancelDismissAction();
mKeyguardView.cleanUp();
}
@@ -184,13 +184,13 @@
mBouncerPromptReason = mCallback.getBouncerPromptReason();
}
- private void ensureView() {
+ protected void ensureView() {
if (mRoot == null) {
inflateView();
}
}
- private void inflateView() {
+ protected void inflateView() {
removeView();
mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null);
mKeyguardView = (KeyguardHostView) mRoot.findViewById(R.id.keyguard_host_view);
@@ -201,7 +201,7 @@
mRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_HOME);
}
- private void removeView() {
+ protected void removeView() {
if (mRoot != null && mRoot.getParent() == mContainer) {
mContainer.removeView(mRoot);
mRoot = null;
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 5be52ca..78497ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -82,6 +82,7 @@
import android.view.MotionEvent;
import android.view.ThreadedRenderer;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewStub;
import android.view.WindowManager;
@@ -279,9 +280,9 @@
VolumeComponent mVolumeComponent;
KeyguardUserSwitcher mKeyguardUserSwitcher;
FlashlightController mFlashlightController;
- UserSwitcherController mUserSwitcherController;
+ protected UserSwitcherController mUserSwitcherController;
NextAlarmController mNextAlarmController;
- KeyguardMonitor mKeyguardMonitor;
+ protected KeyguardMonitor mKeyguardMonitor;
BrightnessMirrorController mBrightnessMirrorController;
AccessibilityController mAccessibilityController;
FullscreenUserSwitcher mFullscreenUserSwitcher;
@@ -295,7 +296,7 @@
StatusBarWindowView mStatusBarWindow;
PhoneStatusBarView mStatusBarView;
private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
- private StatusBarWindowManager mStatusBarWindowManager;
+ protected StatusBarWindowManager mStatusBarWindowManager;
private UnlockMethodCache mUnlockMethodCache;
private DozeServiceHost mDozeServiceHost;
private boolean mWakeUpComingFromTouch;
@@ -422,8 +423,8 @@
private int mMaxKeyguardNotifications;
private ViewMediatorCallback mKeyguardViewMediatorCallback;
- private ScrimController mScrimController;
- private DozeScrimController mDozeScrimController;
+ protected ScrimController mScrimController;
+ protected DozeScrimController mDozeScrimController;
private final Runnable mAutohide = new Runnable() {
@Override
@@ -437,7 +438,7 @@
private boolean mWaitingForKeyguardExit;
private boolean mDozing;
private boolean mDozingRequested;
- private boolean mScrimSrcModeEnabled;
+ protected boolean mScrimSrcModeEnabled;
private Interpolator mLinearInterpolator = new LinearInterpolator();
private Interpolator mBackdropInterpolator = new AccelerateDecelerateInterpolator();
@@ -1072,13 +1073,13 @@
}
}
- private void startKeyguard() {
+ protected void startKeyguard() {
KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class);
mFingerprintUnlockController = new FingerprintUnlockController(mContext,
mStatusBarWindowManager, mDozeScrimController, keyguardViewMediator,
mScrimController, this);
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
- mStatusBarWindow, mStatusBarWindowManager, mScrimController,
+ getBouncerContainer(), mStatusBarWindowManager, mScrimController,
mFingerprintUnlockController);
mKeyguardIndicationController.setStatusBarKeyguardViewManager(
mStatusBarKeyguardViewManager);
@@ -1096,6 +1097,10 @@
return mStatusBarWindow;
}
+ protected ViewGroup getBouncerContainer() {
+ return mStatusBarWindow;
+ }
+
public int getStatusBarHeight() {
if (mNaturalBarHeight < 0) {
final Resources res = mContext.getResources();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index f14f0d4..7a05b8f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -30,6 +30,7 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
+import com.android.systemui.SystemUIFactory;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.RemoteInputController;
@@ -54,11 +55,11 @@
private static String TAG = "StatusBarKeyguardViewManager";
- private final Context mContext;
+ protected final Context mContext;
- private LockPatternUtils mLockPatternUtils;
- private ViewMediatorCallback mViewMediatorCallback;
- private PhoneStatusBar mPhoneStatusBar;
+ protected LockPatternUtils mLockPatternUtils;
+ protected ViewMediatorCallback mViewMediatorCallback;
+ protected PhoneStatusBar mPhoneStatusBar;
private ScrimController mScrimController;
private FingerprintUnlockController mFingerprintUnlockController;
@@ -67,17 +68,17 @@
private boolean mDeviceInteractive = false;
private boolean mScreenTurnedOn;
- private KeyguardBouncer mBouncer;
- private boolean mShowing;
- private boolean mOccluded;
- private boolean mRemoteInputActive;
+ protected KeyguardBouncer mBouncer;
+ protected boolean mShowing;
+ protected boolean mOccluded;
+ protected boolean mRemoteInputActive;
- private boolean mFirstUpdate = true;
- private boolean mLastShowing;
- private boolean mLastOccluded;
+ protected boolean mFirstUpdate = true;
+ protected boolean mLastShowing;
+ protected boolean mLastOccluded;
private boolean mLastBouncerShowing;
private boolean mLastBouncerDismissible;
- private boolean mLastRemoteInputActive;
+ protected boolean mLastRemoteInputActive;
private OnDismissAction mAfterKeyguardGoneAction;
private boolean mDeviceWillWakeUp;
@@ -99,8 +100,8 @@
mStatusBarWindowManager = statusBarWindowManager;
mScrimController = scrimController;
mFingerprintUnlockController = fingerprintUnlockController;
- mBouncer = new KeyguardBouncer(mContext, mViewMediatorCallback, mLockPatternUtils,
- mStatusBarWindowManager, container);
+ mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
+ mViewMediatorCallback, mLockPatternUtils, mStatusBarWindowManager, container);
}
/**
@@ -118,7 +119,7 @@
* Shows the notification keyguard or the bouncer depending on
* {@link KeyguardBouncer#needsFullscreenBouncer()}.
*/
- private void showBouncerOrKeyguard() {
+ protected void showBouncerOrKeyguard() {
if (mBouncer.needsFullscreenBouncer()) {
// The keyguard might be showing (already). So we need to hide it.
@@ -433,7 +434,7 @@
}
};
- private void updateStates() {
+ protected void updateStates() {
int vis = mContainer.getSystemUiVisibility();
boolean showing = mShowing;
boolean occluded = mOccluded;
@@ -451,9 +452,8 @@
}
}
- boolean navBarVisible = (!(showing && !occluded) || bouncerShowing || remoteInputActive);
- boolean lastNavBarVisible = (!(mLastShowing && !mLastOccluded) || mLastBouncerShowing
- || mLastRemoteInputActive);
+ boolean navBarVisible = isNavBarVisible();
+ boolean lastNavBarVisible = getLastNavBarVisible();
if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
if (mPhoneStatusBar.getNavigationBarView() != null) {
if (navBarVisible) {
@@ -495,6 +495,20 @@
mPhoneStatusBar.onKeyguardViewManagerStatesUpdated();
}
+ /**
+ * @return Whether the navigation bar should be made visible based on the current state.
+ */
+ protected boolean isNavBarVisible() {
+ return !(mShowing && !mOccluded) || mBouncer.isShowing() || mRemoteInputActive;
+ }
+
+ /**
+ * @return Whether the navigation bar was made visible based on the last known state.
+ */
+ protected boolean getLastNavBarVisible() {
+ return !(mLastShowing && !mLastOccluded) || mLastBouncerShowing || mLastRemoteInputActive;
+ }
+
public boolean onMenuPressed() {
return mBouncer.onMenuPressed();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index ffec615..05d9626 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -298,6 +298,14 @@
return mContext.getResources().getBoolean(R.bool.config_enableFullscreenUserSwitcher);
}
+ public void logoutCurrentUser() {
+ int currentUser = ActivityManager.getCurrentUser();
+ if (currentUser != UserHandle.USER_SYSTEM) {
+ switchToUserId(UserHandle.USER_SYSTEM);
+ stopUserId(currentUser);
+ }
+ }
+
public void removeUserId(int userId) {
if (userId == UserHandle.USER_SYSTEM) {
Log.w(TAG, "User " + userId + " could not removed.");
@@ -340,6 +348,19 @@
switchToUserId(id);
}
+ public void switchTo(int userId) {
+ final int count = mUsers.size();
+ for (int i = 0; i < count; ++i) {
+ UserRecord record = mUsers.get(i);
+ if (record.info != null && record.info.id == userId) {
+ switchTo(record);
+ return;
+ }
+ }
+
+ Log.e(TAG, "Couldn't switch to user, id=" + userId);
+ }
+
private void switchToUserId(int id) {
try {
pauseRefreshUsers();
@@ -404,11 +425,7 @@
}
return;
} else if (ACTION_LOGOUT_USER.equals(intent.getAction())) {
- int currentUser = ActivityManager.getCurrentUser();
- if (currentUser != UserHandle.USER_SYSTEM) {
- switchToUserId(UserHandle.USER_SYSTEM);
- stopUserId(currentUser);
- }
+ logoutCurrentUser();
} else if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
if (mExitGuestDialog != null && mExitGuestDialog.isShowing()) {
mExitGuestDialog.cancel();