diff options
author | Jorim Jaggi <jjaggi@google.com> | 2014-03-14 17:25:20 +0100 |
---|---|---|
committer | Jorim Jaggi <jjaggi@google.com> | 2014-03-28 22:35:03 +0100 |
commit | 380ecb81db52a9d0197ca969951d07b91c20d2b9 (patch) | |
tree | 753915d98f530e97095dc9f3c95dba67d3fadfb5 /packages/SystemUI/src/com/android/systemui/keyguard | |
parent | ca4761661a41fc0750a2bc5e7c90481216e626c3 (diff) | |
download | frameworks_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/src/com/android/systemui/keyguard')
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java | 272 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/keyguard/KeyguardStatusBarBinder.java | 32 |
2 files changed, 304 insertions, 0 deletions
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(); +} |