summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI
diff options
context:
space:
mode:
authorJorim Jaggi <jjaggi@google.com>2014-03-14 17:25:20 +0100
committerJorim Jaggi <jjaggi@google.com>2014-03-28 22:35:03 +0100
commit380ecb81db52a9d0197ca969951d07b91c20d2b9 (patch)
tree753915d98f530e97095dc9f3c95dba67d3fadfb5 /packages/SystemUI
parentca4761661a41fc0750a2bc5e7c90481216e626c3 (diff)
downloadframeworks_base-380ecb81db52a9d0197ca969951d07b91c20d2b9.zip
frameworks_base-380ecb81db52a9d0197ca969951d07b91c20d2b9.tar.gz
frameworks_base-380ecb81db52a9d0197ca969951d07b91c20d2b9.tar.bz2
Make Keyguard a library and make StatusBar the new Keyguard.
This change achieves a couple of things: - Let Keyguard be a library, so we can use it in SystemUI. - Introduce FLAG_KEYGUARD for windows and deprecate TYPE_KEYGUARD. Make all the TYPE_KEYGUARD behaviour dependant on the flag. - Implement a new KeyguardService in SystemUI, and bind that service from PhoneWindowManager. - Introduce BaseStatusBar.setKeyguardState and inflate KeyguardSimpleHostView there and use FLAG_KEYGUARD for the window, such that the status bar window essentially gets the Keyguard. Bug: 13635952 Change-Id: I059d80d8b9b9818a778ab685f4672ea2694def63
Diffstat (limited to 'packages/SystemUI')
-rw-r--r--packages/SystemUI/Android.mk6
-rw-r--r--packages/SystemUI/AndroidManifest.xml4
-rw-r--r--packages/SystemUI/res/layout-sw600dp/super_status_bar.xml7
-rw-r--r--packages/SystemUI/res/layout/super_status_bar.xml5
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java272
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java32
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java108
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java6
10 files changed, 470 insertions, 15 deletions
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index f8f064a..69c6159 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -6,6 +6,7 @@ LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
src/com/android/systemui/EventLogTags.logtags
+LOCAL_STATIC_JAVA_LIBRARIES := Keyguard
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_PACKAGE_NAME := SystemUI
@@ -14,6 +15,11 @@ LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+LOCAL_RESOURCE_DIR := \
+ frameworks/base/packages/Keyguard/res \
+ $(LOCAL_PATH)/res
+LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard
+
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index b09cc1d..5d03367 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -240,6 +240,10 @@
</intent-filter>
</service>
+ <service
+ android:name=".keyguard.KeyguardService"
+ android:exported="true" />
+
<activity android:name=".Somnambulator"
android:label="@string/start_dreams"
android:icon="@mipmap/ic_launcher_dreams"
diff --git a/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml b/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml
index 0947c6f..49314cd 100644
--- a/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml
+++ b/packages/SystemUI/res/layout-sw600dp/super_status_bar.xml
@@ -31,7 +31,6 @@
android:layout_height="@*android:dimen/status_bar_height"
/>
-
<com.android.systemui.statusbar.phone.PanelHolder
android:id="@+id/panel_holder"
android:layout_width="match_parent"
@@ -49,4 +48,10 @@
android:layout_gravity="end|top"
/>
</com.android.systemui.statusbar.phone.PanelHolder>
+
+ <FrameLayout android:id="@+id/keyguard"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone">
+ </FrameLayout>
</com.android.systemui.statusbar.phone.StatusBarWindowView>
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index 2b56618..188c8a6 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -48,4 +48,9 @@
/>
</com.android.systemui.statusbar.phone.PanelHolder>
+ <FrameLayout android:id="@+id/keyguard"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone">
+ </FrameLayout>
</com.android.systemui.statusbar.phone.StatusBarWindowView>
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
new file mode 100644
index 0000000..cc87735
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2014 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.keyguard;
+
+import com.android.internal.policy.IKeyguardExitCallback;
+import com.android.internal.policy.IKeyguardService;
+import com.android.internal.policy.IKeyguardServiceConstants;
+import com.android.internal.policy.IKeyguardShowCallback;
+import com.android.systemui.statusbar.CommandQueue;
+
+import android.app.ActivityManagerNative;
+import android.app.Service;
+import android.app.StatusBarManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.MotionEvent;
+
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+
+public class KeyguardService extends Service {
+ static final String TAG = "KeyguardService";
+ static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
+
+ public static final String ACTION_STATUS_BAR_BIND = "action.status_bar_bind";
+
+ private CommandQueue mCommandQueue;
+ private StatusBarManager mStatusBarManager;
+
+ @Override
+ public void onCreate() {
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ if (ACTION_STATUS_BAR_BIND.equals(intent.getAction())) {
+ return mKeyguardStatusBarBinder;
+ } else {
+ return mBinder;
+ }
+ }
+
+ void checkPermission() {
+ if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) {
+ Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller());
+ throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
+ + ", must have permission " + PERMISSION);
+ }
+ }
+
+ private final KeyguardStatusBarBinder mKeyguardStatusBarBinder =
+ new KeyguardStatusBarBinder() {
+
+ @Override
+ public void register(CommandQueue commandQueue) {
+ mCommandQueue = commandQueue;
+ }
+
+ @Override
+ public void dismissKeyguard() {
+ try {
+ mBinder.dismiss();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not dismiss keyguard", e);
+ }
+ }
+ };
+
+ private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
+
+ /** Whether the Keyguard is visible. */
+ private boolean mShowing;
+
+ /**
+ * Whether the Keyguard is hidden by a window with
+ * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED}. So mShowing might
+ * be true, but also mHidden. So in the end, the Keyguard would not be visible.
+ */
+ private boolean mHidden;
+ private boolean mShowingDream;
+
+ @Override
+ public synchronized boolean isShowing() {
+ return mShowing;
+ }
+
+ @Override
+ public synchronized boolean isSecure() {
+ return true;
+ }
+
+ @Override
+ public synchronized boolean isShowingAndNotHidden() {
+ return mShowing && !mHidden;
+ }
+
+ @Override
+ public synchronized boolean isInputRestricted() {
+ return false;
+ }
+
+ @Override
+ public synchronized void verifyUnlock(IKeyguardExitCallback callback) {
+ }
+
+ @Override
+ public synchronized void keyguardDone(boolean authenticated, boolean wakeup) {
+ checkPermission();
+ mShowing = false;
+ adjustStatusBarLocked();
+ if (mCommandQueue != null) {
+ mCommandQueue.setKeyguardShown(false, null, true);
+ }
+ }
+
+ @Override
+ public synchronized int setHidden(boolean isHidden) {
+ checkPermission();
+ if (mHidden == isHidden) {
+ return IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_NONE;
+ }
+ mHidden = isHidden;
+ try {
+ ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mHidden
+ || mShowingDream);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not update activity manager lock screen state", e);
+ }
+ adjustStatusBarLocked();
+ if (mCommandQueue != null) {
+ mCommandQueue.setKeyguardShown(!isHidden, null, false);
+ }
+ return isShowingAndNotHidden()
+ ? IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_SET_FLAGS
+ : IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_UNSET_FLAGS;
+ }
+
+ @Override
+ public synchronized void dismiss() {
+ checkPermission();
+ mShowing = false;
+ adjustStatusBarLocked();
+ if (mCommandQueue != null) {
+ mCommandQueue.setKeyguardShown(false, null, true);
+ }
+ }
+
+ @Override
+ public synchronized void onDreamingStarted() {
+ checkPermission();
+ mShowingDream = true;
+ }
+
+ @Override
+ public synchronized void onDreamingStopped() {
+ checkPermission();
+ mShowingDream = false;
+ }
+
+ @Override
+ public synchronized void onScreenTurnedOff(int reason) {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void onScreenTurnedOn(IKeyguardShowCallback callback) {
+ checkPermission();
+ mShowing = true;
+ adjustStatusBarLocked();
+ if (mCommandQueue != null) {
+ mCommandQueue.setKeyguardShown(isShowingAndNotHidden(), callback, true);
+ }
+ }
+
+ @Override
+ public synchronized void setKeyguardEnabled(boolean enabled) {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized boolean isDismissable() {
+ return !isSecure();
+ }
+
+ @Override
+ public synchronized void onSystemReady() {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void doKeyguardTimeout(Bundle options) {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void setCurrentUser(int userId) {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void showAssistant() {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void dispatch(MotionEvent event) {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void launchCamera() {
+ checkPermission();
+ }
+
+ @Override
+ public synchronized void onBootCompleted() {
+ checkPermission();
+ onScreenTurnedOn(null);
+ }
+
+ private void adjustStatusBarLocked() {
+ if (mStatusBarManager == null) {
+ mStatusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
+ }
+ if (mStatusBarManager == null) {
+ Log.w(TAG, "Could not get status bar manager");
+ } else {
+ // Disable aspects of the system/status/navigation bars that must not be re-enabled by
+ // windows that appear on top, ever
+ int flags = StatusBarManager.DISABLE_NONE;
+ if (isShowing()) {
+ // Permanently disable components not available when keyguard is enabled
+ // (like recents). Temporary enable/disable (e.g. the "back" button) are
+ // done in KeyguardHostView.
+ flags |= StatusBarManager.DISABLE_RECENT;
+ if (isSecure()) {
+ // showing secure lockscreen; disable ticker and switch private notifications
+ // to show their public versions, if available.
+ flags |= StatusBarManager.DISABLE_PRIVATE_NOTIFICATIONS;
+ }
+ if (false) {
+ flags |= StatusBarManager.DISABLE_SEARCH;
+ }
+ }
+ if (isShowingAndNotHidden()) {
+ flags |= StatusBarManager.DISABLE_HOME;
+ }
+ mStatusBarManager.disable(flags);
+ }
+ }
+ };
+}
+
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java
new file mode 100644
index 0000000..566943b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 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.keyguard;
+
+import com.android.systemui.statusbar.CommandQueue;
+
+import android.os.Binder;
+import android.os.IBinder;
+
+/**
+ * Communication interface from status bar to {@link com.android.systemui.keyguard.KeyguardService}.
+ */
+public abstract class KeyguardStatusBarBinder extends Binder {
+
+ public abstract void register(CommandQueue commandQueue);
+
+ public abstract void dismissKeyguard();
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index bad5641..eee6876 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -22,9 +22,11 @@ import android.app.Notification;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -77,6 +79,8 @@ import com.android.systemui.R;
import com.android.systemui.RecentsComponent;
import com.android.systemui.SearchPanelView;
import com.android.systemui.SystemUI;
+import com.android.systemui.keyguard.KeyguardService;
+import com.android.systemui.keyguard.KeyguardStatusBarBinder;
import com.android.systemui.statusbar.phone.KeyguardTouchDelegate;
import java.util.ArrayList;
@@ -172,6 +176,8 @@ public abstract class BaseStatusBar extends SystemUI implements
protected int mZenMode;
+ protected KeyguardStatusBarBinder mKeyguardService;
+
public IStatusBarService getStatusBarService() {
return mBarService;
}
@@ -314,6 +320,7 @@ public abstract class BaseStatusBar extends SystemUI implements
createAndAddWindows();
+ startKeyguardService();
disable(switches[0]);
setSystemUiVisibility(switches[1], 0xffffffff);
topAppWindowChanged(switches[2] != 0);
@@ -364,6 +371,25 @@ public abstract class BaseStatusBar extends SystemUI implements
updateRelatedUserCache();
}
+ private void startKeyguardService() {
+ Intent intent = new Intent(mContext, KeyguardService.class);
+ intent.setAction(KeyguardService.ACTION_STATUS_BAR_BIND);
+ if (!mContext.bindService(intent, new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mKeyguardService = (KeyguardStatusBarBinder) service;
+ mKeyguardService.register(mCommandQueue);
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+
+ }
+ }, Context.BIND_AUTO_CREATE)) {
+ throw new RuntimeException("Couldn't bind status bar keyguard.");
+ }
+ }
+
public void userSwitched(int newUserId) {
// should be overridden
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 39333d7..cf6f60c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -21,6 +21,7 @@ import android.os.IBinder;
import android.os.Message;
import android.service.notification.StatusBarNotification;
+import com.android.internal.policy.IKeyguardShowCallback;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
@@ -56,6 +57,7 @@ public class CommandQueue extends IStatusBar.Stub {
private static final int MSG_PRELOAD_RECENT_APPS = 14 << MSG_SHIFT;
private static final int MSG_CANCEL_PRELOAD_RECENT_APPS = 15 << MSG_SHIFT;
private static final int MSG_SET_WINDOW_STATE = 16 << MSG_SHIFT;
+ private static final int MSG_SET_KEYGUARD_SHOWN = 17 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -98,6 +100,8 @@ public class CommandQueue extends IStatusBar.Stub {
public void hideSearchPanel();
public void cancelPreloadRecentApps();
public void setWindowState(int window, int state);
+ public void setKeyguardShown(boolean showKeyguard, IKeyguardShowCallback callback,
+ boolean updateWindowFlags);
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -232,6 +236,15 @@ public class CommandQueue extends IStatusBar.Stub {
}
}
+ public void setKeyguardShown(boolean showKeyguard, IKeyguardShowCallback callback,
+ boolean updateWindowFlags) {
+ synchronized (mList) {
+ mHandler.removeMessages(MSG_SET_KEYGUARD_SHOWN);
+ mHandler.obtainMessage(MSG_SET_KEYGUARD_SHOWN,
+ showKeyguard ? 1 : 0, updateWindowFlags ? 1 : 0, callback).sendToTarget();
+ }
+ }
+
private final class H extends Handler {
public void handleMessage(Message msg) {
final int what = msg.what & MSG_MASK;
@@ -295,7 +308,7 @@ public class CommandQueue extends IStatusBar.Stub {
mCallbacks.topAppWindowChanged(msg.arg1 != 0);
break;
case MSG_SHOW_IME_BUTTON:
- mCallbacks.setImeWindowStatus((IBinder)msg.obj, msg.arg1, msg.arg2);
+ mCallbacks.setImeWindowStatus((IBinder) msg.obj, msg.arg1, msg.arg2);
break;
case MSG_SET_HARD_KEYBOARD_STATUS:
mCallbacks.setHardKeyboardStatus(msg.arg1 != 0, msg.arg2 != 0);
@@ -312,6 +325,10 @@ public class CommandQueue extends IStatusBar.Stub {
case MSG_SET_WINDOW_STATE:
mCallbacks.setWindowState(msg.arg1, msg.arg2);
break;
+ case MSG_SET_KEYGUARD_SHOWN:
+ mCallbacks.setKeyguardShown(msg.arg1 != 0, (IKeyguardShowCallback) msg.obj,
+ msg.arg2 != 0);
+ break;
}
}
}
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 e7f96dc..44f5e3a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -65,6 +65,7 @@ import android.util.EventLog;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
+import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
@@ -72,17 +73,22 @@ 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.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
+import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+import com.android.internal.policy.IKeyguardShowCallback;
import com.android.internal.statusbar.StatusBarIcon;
+import com.android.keyguard.KeyguardHostView;
+import com.android.keyguard.KeyguardSimpleHostView;
import com.android.systemui.DemoMode;
import com.android.systemui.EventLogTags;
import com.android.systemui.R;
@@ -350,6 +356,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
}
}};
+ private boolean mKeyguardShowing;
+
+ private ViewGroup mKeyguard;
+
+ private Button mDismissKeyguard;
+
@Override
public void setZenMode(int mode) {
super.setZenMode(mode);
@@ -431,6 +443,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
}
});
+ mKeyguard = (ViewGroup) mStatusBarWindow.findViewById(R.id.keyguard);
if (!ActivityManager.isHighEndGfx()) {
mStatusBarWindow.setBackground(null);
mNotificationPanel.setBackground(new FastColorDrawable(context.getResources().getColor(
@@ -1495,15 +1508,19 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
// Expand the window to encompass the full screen in anticipation of the drag.
// This is only possible to do atomically because the status bar is at the top of the screen!
+ expandWindow();
+
+ visibilityChanged(true);
+
+ setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
+ }
+
+ private void expandWindow() {
WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
mWindowManager.updateViewLayout(mStatusBarWindow, lp);
-
- visibilityChanged(true);
-
- setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
}
private void releaseFocus() {
@@ -1539,7 +1556,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
}
- if (mStatusBarWindow != null) {
+ if (mStatusBarWindow != null && !mKeyguardShowing) {
mStatusBarWindow.cancelExpandHelper();
mStatusBarView.collapseAllPanels(true);
}
@@ -1751,7 +1768,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
if (SPEW) Log.d(TAG, "makeExpandedInvisible: mExpandedVisible=" + mExpandedVisible
+ " mExpandedVisible=" + mExpandedVisible);
- if (!mExpandedVisible || mStatusBarWindow == null) {
+ if (!mExpandedVisible || mStatusBarWindow == null || mKeyguardShowing) {
return;
}
@@ -1785,11 +1802,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
visibilityChanged(false);
// Shrink the window to the size of the status bar only
- WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
- lp.height = getStatusBarHeight();
- lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
- lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
- mWindowManager.updateViewLayout(mStatusBarWindow, lp);
+ contractWindow();
if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) {
setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
@@ -1806,6 +1819,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
}
+ private void contractWindow() {
+ WindowManager.LayoutParams lp =
+ (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
+ lp.height = getStatusBarHeight();
+ lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
+ lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+ mWindowManager.updateViewLayout(mStatusBarWindow, lp);
+ }
+
/**
* Enables or disables layers on the children of the notifications pile.
*
@@ -1914,7 +1936,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
&& mStatusBarWindowState != state) {
mStatusBarWindowState = state;
if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state));
- if (!showing) {
+ if (!showing && !mKeyguardShowing) {
mStatusBarView.collapseAllPanels(false);
}
}
@@ -2356,7 +2378,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
PixelFormat.TRANSLUCENT);
lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
-
lp.gravity = getStatusBarGravity();
lp.setTitle("StatusBar");
lp.packageName = mContext.getPackageName();
@@ -2671,6 +2692,67 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
}
}
+ @Override
+ public void setKeyguardShown(boolean showKeyguard, final IKeyguardShowCallback callback,
+ boolean updateWindowFlags) {
+ mKeyguardShowing = showKeyguard;
+ if (updateWindowFlags) {
+ WindowManager.LayoutParams lp =
+ (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
+ if (showKeyguard) {
+ lp.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
+ } else {
+ lp.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
+ lp.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
+ }
+ mWindowManager.updateViewLayout(mStatusBarWindow, lp);
+ }
+ if (!showKeyguard) {
+ mKeyguard.setVisibility(View.GONE);
+ mKeyguard.removeAllViews();
+ contractWindow();
+ } else {
+ expandWindow();
+ mKeyguard.setVisibility(View.VISIBLE);
+ KeyguardSimpleHostView view = (KeyguardSimpleHostView) LayoutInflater.from(mContext)
+ .inflate(R.layout.keyguard_simple_host_view, mKeyguard, false);
+ mKeyguard.addView(view);
+ view.setOnDismissAction(new KeyguardHostView.OnDismissAction() {
+ @Override
+ public boolean onDismiss() {
+ contractWindow();
+ if (mKeyguardService != null) {
+ mKeyguardService.dismissKeyguard();
+ }
+ return false;
+ }
+ });
+ view.show();
+ }
+ if (callback != null) {
+ mStatusBarView.getViewTreeObserver().addOnPreDrawListener(
+ new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ mStatusBarView.getViewTreeObserver().removeOnPreDrawListener(this);
+ mStatusBarView.post(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ callback.onShown(mStatusBarWindow.getWindowToken());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not call show callback", e);
+ }
+ }
+ });
+ return true;
+ }
+ });
+ }
+
+ }
+
/**
* Reload some of our resources when the configuration changes.
*
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index dd13e31..2dc3373 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -22,6 +22,7 @@ import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
+import com.android.internal.policy.IKeyguardShowCallback;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.statusbar.BaseStatusBar;
@@ -93,6 +94,11 @@ public class TvStatusBar extends BaseStatusBar {
}
@Override
+ public void setKeyguardShown(boolean showKeyguard, IKeyguardShowCallback callback,
+ boolean updateKeyguardFlags) {
+ }
+
+ @Override
protected void createAndAddWindows() {
}