diff options
Diffstat (limited to 'services/core/java/com/android/server/policy')
4 files changed, 183 insertions, 138 deletions
diff --git a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java index fef1e57..e6ec6a6 100644 --- a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java +++ b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java @@ -72,6 +72,9 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, /* 1 means increasing, -1 means decreasing */ private int mYOffsetDirection = 1; + private int mAppliedBurnInXOffset = 0; + private int mAppliedBurnInYOffset = 0; + private final AlarmManager mAlarmManager; private final PendingIntent mBurnInProtectionIntent; private final DisplayManagerInternal mDisplayManagerInternal; @@ -139,6 +142,8 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, mFirstUpdate = false; } else { adjustOffsets(); + mAppliedBurnInXOffset = mLastBurnInXOffset; + mAppliedBurnInYOffset = mLastBurnInYOffset; mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), mLastBurnInXOffset, mLastBurnInYOffset); } @@ -258,6 +263,8 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, @Override public void onAnimationEnd(Animator animator) { if (animator == mCenteringAnimator && !mBurnInProtectionActive) { + mAppliedBurnInXOffset = 0; + mAppliedBurnInYOffset = 0; // No matter how the animation finishes, we want to zero the offsets. mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), 0, 0); } @@ -276,7 +283,7 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, if (!mBurnInProtectionActive) { final float value = (Float) valueAnimator.getAnimatedValue(); mDisplayManagerInternal.setDisplayOffsets(mDisplay.getDisplayId(), - (int) (mLastBurnInXOffset * value), (int) (mLastBurnInYOffset * value)); + (int) (mAppliedBurnInXOffset * value), (int) (mAppliedBurnInYOffset * value)); } } } diff --git a/services/core/java/com/android/server/policy/GlobalActions.java b/services/core/java/com/android/server/policy/GlobalActions.java index 8c42917..9b5f5d0 100644 --- a/services/core/java/com/android/server/policy/GlobalActions.java +++ b/services/core/java/com/android/server/policy/GlobalActions.java @@ -22,12 +22,14 @@ import com.android.internal.app.AlertController.AlertParams; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.internal.R; +import com.android.internal.util.UserIcons; import com.android.internal.widget.LockPatternUtils; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AlertDialog; import android.app.Dialog; +import android.app.INotificationManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -35,10 +37,17 @@ import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.ThemeUtils; import android.content.pm.UserInfo; import android.content.ServiceConnection; import android.database.ContentObserver; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.Manifest; import android.media.AudioManager; @@ -58,6 +67,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; import android.provider.Settings; +import android.provider.Settings.Global; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; import android.telephony.PhoneStateListener; @@ -84,12 +94,15 @@ import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.ListView; import android.widget.TextView; + import cyanogenmod.providers.CMSettings; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.cyanogenmod.internal.util.ThemeUtils; + import static com.android.internal.util.cm.PowerMenuConstants.*; /** @@ -163,6 +176,9 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mShowSilentToggle = SHOW_SILENT_TOGGLE && !mContext.getResources().getBoolean( com.android.internal.R.bool.config_useFixedVolume); + // Set the initial status of airplane mode toggle + mAirplaneState = getUpdatedAirplaneToggleState(); + updatePowerMenuActions(); } @@ -612,16 +628,24 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac if (um.isUserSwitcherEnabled()) { List<UserInfo> users = um.getUsers(); UserInfo currentUser = getCurrentUser(); + final int avatarSize = mContext.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.global_actions_avatar_size); for (final UserInfo user : users) { if (user.supportsSwitchTo()) { boolean isCurrentUser = currentUser == null ? user.id == 0 : (currentUser.id == user.id); - Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath) - : null; + Drawable avatar = null; + Bitmap rawAvatar = um.getUserIcon(user.id); + if (rawAvatar == null) { + rawAvatar = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon( + user.isGuest() ? UserHandle.USER_NULL : user.id, /*light=*/ false)); + } + avatar = new BitmapDrawable(mContext.getResources(), + createCircularClip(rawAvatar, avatarSize, avatarSize)); + SinglePressAction switchToUser = new SinglePressAction( - com.android.internal.R.drawable.ic_lock_user, icon, - (user.name != null ? user.name : "Primary") - + (isCurrentUser ? " \u2714" : "")) { + com.android.internal.R.drawable.ic_lock_user, avatar, + (user.name != null ? user.name : "Primary")) { public void onPress() { try { ActivityManagerNative.getDefault().switchUser(user.id); @@ -638,6 +662,10 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac return false; } }; + if (isCurrentUser) { + switchToUser.setStatus(mContext.getString( + R.string.global_action_current_user)); + } items.add(switchToUser); } } @@ -721,7 +749,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac @Override public void onServiceDisconnected(ComponentName name) {} }; - if (mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE)) { + if (mContext.bindServiceAsUser( + intent, conn, Context.BIND_AUTO_CREATE, UserHandle.CURRENT)) { mScreenshotConnection = conn; mHandler.postDelayed(mScreenshotTimeout, 10000); } @@ -890,6 +919,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac private final Drawable mIcon; private final int mMessageResId; private final CharSequence mMessage; + private CharSequence mStatusMessage; protected SinglePressAction(int iconResId, int messageResId) { mIconResId = iconResId; @@ -916,8 +946,12 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac return true; } - public String getStatus() { - return null; + public CharSequence getStatus() { + return mStatusMessage; + } + + public void setStatus(CharSequence status) { + mStatusMessage = status; } abstract public void onPress(); @@ -938,7 +972,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac TextView messageView = (TextView) v.findViewById(R.id.message); TextView statusView = (TextView) v.findViewById(R.id.status); - final String status = getStatus(); + final CharSequence status = getStatus(); if (!TextUtils.isEmpty(status)) { statusView.setText(status); } else { @@ -946,7 +980,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } if (mIcon != null) { icon.setImageDrawable(mIcon); - icon.setScaleType(ScaleType.CENTER_CROP); + icon.setScaleType(ScaleType.CENTER); } else if (mIconResId != 0) { icon.setImageDrawable(context.getDrawable(mIconResId)); } @@ -1116,9 +1150,9 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } } - private static class SilentModeTriStateAction implements Action, View.OnClickListener { + private final class SilentModeTriStateAction implements Action, View.OnClickListener { - private final int[] ITEM_IDS = { R.id.option1, R.id.option2, R.id.option3 }; + private final int[] ITEM_IDS = { R.id.option1, R.id.option2, R.id.option3, R.id.option4 }; private final AudioManager mAudioManager; private final Handler mHandler; @@ -1130,14 +1164,15 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mContext = context; } - private int ringerModeToIndex(int ringerMode) { - // They just happen to coincide - return ringerMode; - } - private int indexToRingerMode(int index) { - // They just happen to coincide - return index; + if (index == 2) { + if (mHasVibrator) { + return AudioManager.RINGER_MODE_VIBRATE; + } else { + return AudioManager.RINGER_MODE_NORMAL; + } + } + return AudioManager.RINGER_MODE_NORMAL; } @Override @@ -1149,9 +1184,28 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac LayoutInflater inflater) { View v = inflater.inflate(R.layout.global_actions_silent_mode, parent, false); - int selectedIndex = ringerModeToIndex(mAudioManager.getRingerMode()); - for (int i = 0; i < 3; i++) { + int ringerMode = mAudioManager.getRingerModeInternal(); + int zenMode = Global.getInt(mContext.getContentResolver(), Global.ZEN_MODE, + Global.ZEN_MODE_OFF); + int selectedIndex = 0; + if (zenMode != Global.ZEN_MODE_OFF) { + if (zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS) { + selectedIndex = 0; + } else if (zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) { + selectedIndex = 1; + } + } else if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { + selectedIndex = 2; + } else if (ringerMode == AudioManager.RINGER_MODE_NORMAL) { + selectedIndex = 3; + } + + for (int i = 0; i < ITEM_IDS.length; i++) { View itemView = v.findViewById(ITEM_IDS[i]); + if (!mHasVibrator && i == 2) { + itemView.setVisibility(View.GONE); + continue; + } itemView.setSelected(selectedIndex == i); // Set up click handler itemView.setTag(i); @@ -1182,7 +1236,28 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac if (!(v.getTag() instanceof Integer)) return; int index = (Integer) v.getTag(); - mAudioManager.setRingerMode(indexToRingerMode(index)); + if (index == 0 || index == 1) { + int zenMode = index == 0 + ? Global.ZEN_MODE_NO_INTERRUPTIONS + : Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + // ZenModeHelper will revert zen mode back to the previous value if we just + // put the value into the Settings db, so use INotificationManager instead + INotificationManager noMan = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + try { + noMan.setZenMode(zenMode, null, TAG); + } catch (RemoteException e) { + Log.e(TAG, "Unable to set zen mode", e); + } + } else { + Global.putInt(mContext.getContentResolver(), Global.ZEN_MODE, Global.ZEN_MODE_OFF); + } + + if (index == 2 || index == 3) { + int ringerMode = indexToRingerMode(index); + mAudioManager.setRingerModeInternal(ringerMode); + } + mAdapter.notifyDataSetChanged(); mHandler.sendEmptyMessageDelayed(MESSAGE_DISMISS, DIALOG_DISMISS_DELAY); } } @@ -1274,15 +1349,17 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } }; + private ToggleAction.State getUpdatedAirplaneToggleState() { + return (Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 1) ? + ToggleAction.State.On : ToggleAction.State.Off; + } + private void onAirplaneModeChanged() { // Let the service state callbacks handle the state. if (mHasTelephony) return; - boolean airplaneModeOn = Settings.Global.getInt( - mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_ON, - 0) == 1; - mAirplaneState = airplaneModeOn ? ToggleAction.State.On : ToggleAction.State.Off; + mAirplaneState = getUpdatedAirplaneToggleState(); mAirplaneModeOn.updateState(mAirplaneState); } @@ -1303,6 +1380,33 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac } } + /** + * Generate a new bitmap (width x height pixels, ARGB_8888) with the input bitmap scaled + * to fit and clipped to an inscribed circle. + * @param input Bitmap to resize and clip + * @param width Width of output bitmap (and diameter of circle) + * @param height Height of output bitmap + * @return A shiny new bitmap for you to use + */ + private static Bitmap createCircularClip(Bitmap input, int width, int height) { + if (input == null) return null; + + final int inWidth = input.getWidth(); + final int inHeight = input.getHeight(); + final Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(output); + final Paint paint = new Paint(); + paint.setShader(new BitmapShader(input, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); + paint.setAntiAlias(true); + final RectF srcRect = new RectF(0, 0, inWidth, inHeight); + final RectF dstRect = new RectF(0, 0, width, height); + final Matrix m = new Matrix(); + m.setRectToRect(srcRect, dstRect, Matrix.ScaleToFit.CENTER); + canvas.setMatrix(m); + canvas.drawCircle(inWidth / 2, inHeight / 2, inWidth / 2, paint); + return output; + } + private static final class GlobalActionsDialog extends Dialog implements DialogInterface { private final Context mContext; private final int mWindowTouchSlop; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 58f26fa..9cb969c 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -83,10 +83,11 @@ import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; import android.speech.RecognizerIntent; import android.telecom.TelecomManager; -import android.service.gesture.EdgeGestureManager; import com.android.internal.os.DeviceKeyHandler; import com.android.internal.util.cm.ActionUtils; + +import cyanogenmod.hardware.CMHardwareManager; import cyanogenmod.providers.CMSettings; import dalvik.system.DexClassLoader; import android.util.DisplayMetrics; @@ -129,8 +130,6 @@ import com.android.internal.R; import com.android.internal.policy.IKeyguardService; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.ScreenShapeHelper; -import com.android.internal.util.gesture.EdgeGesturePosition; -import com.android.internal.util.gesture.EdgeServiceConstants; import com.android.internal.view.RotationPolicy; import com.android.internal.widget.PointerLocationView; import com.android.server.GestureLauncherService; @@ -749,6 +748,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mHasPermanentMenuKey; private boolean mClearedBecauseOfForceShow; private boolean mTopWindowIsKeyguard; + private CMHardwareManager mCMHardware; private class PolicyHandler extends Handler { @Override @@ -899,9 +899,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { CMSettings.System.VOLBTN_MUSIC_CONTROLS), false, this, UserHandle.USER_ALL); resolver.registerContentObserver(CMSettings.System.getUriFor( - CMSettings.System.USE_EDGE_SERVICE_FOR_GESTURES), false, this, - UserHandle.USER_ALL); - resolver.registerContentObserver(CMSettings.System.getUriFor( CMSettings.System.BACK_WAKE_SCREEN), false, this, UserHandle.USER_ALL); resolver.registerContentObserver(CMSettings.System.getUriFor( @@ -995,67 +992,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { private SystemGesturesPointerEventListener mSystemGestures; - private EdgeGestureManager.EdgeGestureActivationListener mEdgeGestureActivationListener - = new EdgeGestureManager.EdgeGestureActivationListener() { - - @Override - public void onEdgeGestureActivation(int touchX, int touchY, - EdgeGesturePosition position, int flags) { - WindowState target = null; - - if (position == EdgeGesturePosition.TOP) { - target = mStatusBar; - } else if (position == EdgeGesturePosition.BOTTOM && mNavigationBarOnBottom) { - target = mNavigationBar; - } else if (position == EdgeGesturePosition.LEFT - && !mNavigationBarOnBottom && mNavigationBarLeftInLandscape) { - target = mNavigationBar; - } else if (position == EdgeGesturePosition.RIGHT && !mNavigationBarOnBottom) { - target = mNavigationBar; - } - - if (target != null) { - requestTransientBars(target); - dropEventsUntilLift(); - mEdgeListenerActivated = true; - } else { - restoreListenerState(); - } - } - }; - private EdgeGestureManager mEdgeGestureManager = null; - private int mLastEdgePositions = 0; - private boolean mEdgeListenerActivated = false; - private boolean mUsingEdgeGestureServiceForGestures = false; - - private void updateEdgeGestureListenerState() { - int flags = 0; - if (mUsingEdgeGestureServiceForGestures) { - flags = EdgeServiceConstants.LONG_LIVING | EdgeServiceConstants.UNRESTRICTED; - if (mStatusBar != null && !mStatusBar.isVisibleLw()) { - flags |= EdgeGesturePosition.TOP.FLAG; - } - if (mNavigationBar != null && !mNavigationBar.isVisibleLw() && !isStatusBarKeyguard()) { - if (mNavigationBarOnBottom) { - flags |= EdgeGesturePosition.BOTTOM.FLAG; - } else if (mNavigationBarLeftInLandscape) { - flags |= EdgeGesturePosition.LEFT.FLAG; - } else { - flags |= EdgeGesturePosition.RIGHT.FLAG; - } - } - } - if (mEdgeListenerActivated) { - mEdgeGestureActivationListener.restoreListenerState(); - mEdgeListenerActivated = false; - } - if (flags != mLastEdgePositions) { - mEdgeGestureManager.updateEdgeGestureActivationListener(mEdgeGestureActivationListener, - flags); - mLastEdgePositions = flags; - } - } - IStatusBarService getStatusBarService() { synchronized (mServiceAquireLock) { if (mStatusBarService == null) { @@ -1634,6 +1570,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class); mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); // Init display burn-in protection boolean burnInProtectionEnabled = context.getResources().getBoolean( @@ -1677,7 +1614,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { mOrientationListener.setCurrentRotation(windowManager.getRotation()); } catch (RemoteException ex) { } mSettingsObserver = new SettingsObserver(mHandler); - mSettingsObserver.observe(); mShortcutManager = new ShortcutManager(context); mUiMode = context.getResources().getInteger( com.android.internal.R.integer.config_defaultUiModeType); @@ -2186,23 +2122,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { updateWakeGestureListenerLp(); } - final boolean useEdgeService = CMSettings.System.getIntForUser(resolver, - CMSettings.System.USE_EDGE_SERVICE_FOR_GESTURES, 0, UserHandle.USER_CURRENT) == 1; - if (useEdgeService ^ mUsingEdgeGestureServiceForGestures && mSystemReady) { - if (!mUsingEdgeGestureServiceForGestures && useEdgeService) { - mUsingEdgeGestureServiceForGestures = true; - mWindowManagerFuncs.unregisterPointerEventListener(mSystemGestures); - } else if (mUsingEdgeGestureServiceForGestures && !useEdgeService) { - mUsingEdgeGestureServiceForGestures = false; - mWindowManagerFuncs.registerPointerEventListener(mSystemGestures); - } - updateEdgeGestureListenerState(); - } - boolean devForceNavbar = CMSettings.Secure.getIntForUser(resolver, CMSettings.Secure.DEV_FORCE_SHOW_NAVBAR, 0, UserHandle.USER_CURRENT) == 1; if (devForceNavbar != mDevForceNavbar) { mDevForceNavbar = devForceNavbar; + if (mCMHardware.isSupported(CMHardwareManager.FEATURE_KEY_DISABLE)) { + mCMHardware.set(CMHardwareManager.FEATURE_KEY_DISABLE, mDevForceNavbar); + } } mNavigationBarLeftInLandscape = CMSettings.System.getIntForUser(resolver, @@ -3167,19 +3093,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { + " canceled=" + canceled); } - // If the boot mode is power off alarm, we should not dispatch the several physical keys - // in power off alarm UI to avoid pausing power off alarm UI. - int isPowerOffAlarmMode = Settings.System.getInt(mContext.getContentResolver(), - Settings.System.POWER_OFF_ALARM_MODE, 0); - if (DEBUG_INPUT) { Log.d(TAG, "intercept Dispatching isPowerOffAlarmMode = " + - isPowerOffAlarmMode); } - - if (isPowerOffAlarmMode == 1 && (keyCode == KeyEvent.KEYCODE_HOME - || keyCode == KeyEvent.KEYCODE_SEARCH - || keyCode == KeyEvent.KEYCODE_MENU)) { - return -1; // ignore the physical key here - } - // If we think we might have a volume down & power key chord on the way // but we're not sure, then tell the dispatcher to wait a little while and // try again later before dispatching. @@ -4042,8 +3955,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { mNavigationBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility); mRecentsVisible = (visibility & View.RECENT_APPS_VISIBLE) > 0; - updateEdgeGestureListenerState(); - // Reset any bits in mForceClearingStatusBarVisibility that // are now clear. mResettingSystemUiFlags &= visibility; @@ -5372,7 +5283,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { // update since mAllowLockscreenWhenOn might have changed updateLockScreenTimeout(); - updateEdgeGestureListenerState(); return changes; } @@ -5661,7 +5571,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (isValidGlobalKey(keyCode) && mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) { if (isWakeKey) { - wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY"); + wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, + "android.policy:KEY", true); } return result; } @@ -5924,6 +5835,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { break; } + case KeyEvent.KEYCODE_SOFT_SLEEP: { + result &= ~ACTION_PASS_TO_USER; + isWakeKey = false; + if (!down) { + mPowerManagerInternal.setUserInactiveOverrideFromWindowManager(); + } + break; + } + case KeyEvent.KEYCODE_WAKEUP: { result &= ~ACTION_PASS_TO_USER; isWakeKey = true; @@ -5999,7 +5919,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (isWakeKey) { - wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY"); + wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY", true); } return result; @@ -6136,11 +6056,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private boolean shouldDispatchInputWhenNonInteractive() { - if (mDisplay == null || mDisplay.getState() == Display.STATE_OFF) { - return false; - } - // Send events to keyguard while the screen is on and it's showing. - if (isKeyguardShowingAndNotOccluded()) { + // Send events to keyguard while the screen is on. + if (isKeyguardShowingAndNotOccluded() && mDisplay != null + && mDisplay.getState() != Display.STATE_OFF) { return true; } @@ -6439,10 +6357,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void wakeUpFromPowerKey(long eventTime) { - wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey, "android.policy:POWER"); + wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey, "android.policy:POWER", true); } private boolean wakeUp(long wakeTime, boolean wakeInTheaterMode, String reason) { + return wakeUp(wakeTime, wakeInTheaterMode, reason, false); + } + + private boolean wakeUp(long wakeTime, boolean wakeInTheaterMode, String reason, + boolean withProximityCheck) { final boolean theaterModeEnabled = isTheaterModeEnabled(); if (!wakeInTheaterMode && theaterModeEnabled) { return false; @@ -6453,7 +6376,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { Settings.Global.THEATER_MODE_ON, 0); } - mPowerManager.wakeUp(wakeTime, reason); + if (withProximityCheck) { + mPowerManager.wakeUpWithProximityCheck(wakeTime, reason); + } else { + mPowerManager.wakeUp(wakeTime, reason); + } return true; } @@ -6968,8 +6895,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { mKeyguardDelegate = new KeyguardServiceDelegate(mContext); mKeyguardDelegate.onSystemReady(); - mEdgeGestureManager = EdgeGestureManager.getInstance(); - mEdgeGestureManager.setEdgeGestureActivationListener(mEdgeGestureActivationListener); + mCMHardware = CMHardwareManager.getInstance(mContext); + // Ensure observe happens in systemReady() since we need + // CMHardwareService to be up and running + mSettingsObserver.observe(); readCameraLensCoverState(); updateUiMode(); diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java index 9916223..651ee22 100644 --- a/services/core/java/com/android/server/policy/WindowOrientationListener.java +++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java @@ -55,6 +55,7 @@ public abstract class WindowOrientationListener { private boolean mEnabled; private int mRate; private String mSensorType; + private boolean mUseSystemClockforRotationSensor; private Sensor mSensor; private OrientationJudge mOrientationJudge; private int mCurrentRotation = -1; @@ -90,6 +91,9 @@ public abstract class WindowOrientationListener { mSensorType = context.getResources().getString( com.android.internal.R.string.config_orientationSensorType); + mUseSystemClockforRotationSensor = context.getResources().getBoolean( + com.android.internal.R.bool.config_useSystemClockforRotationSensor); + if (!TextUtils.isEmpty(mSensorType)) { List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL); final int N = sensors.size(); @@ -598,7 +602,8 @@ public abstract class WindowOrientationListener { // Reset the orientation listener state if the samples are too far apart in time // or when we see values of (0, 0, 0) which indicates that we polled the // accelerometer too soon after turning it on and we don't have any data yet. - final long now = event.timestamp; + final long now = mUseSystemClockforRotationSensor + ? SystemClock.elapsedRealtimeNanos() : event.timestamp; final long then = mLastFilteredTimestampNanos; final float timeDeltaMS = (now - then) * 0.000001f; final boolean skipSample; |