diff options
| author | 2015-08-11 13:55:53 +0000 | |
|---|---|---|
| committer | 2015-08-11 13:55:53 +0000 | |
| commit | 36052477465f51a4c690e4e8dfb290fb15ce88b0 (patch) | |
| tree | dec84d21c3f7224448b0eca7a3298a89a1278e93 | |
| parent | 467951eebbc6525b40a6b569c401849fe2394c1d (diff) | |
| parent | 5a5e7d64bb3c52f9910f49d912a59047f0ab32ba (diff) | |
Merge "Add setting to disable camera gesture" into mnc-dr-dev
| -rw-r--r-- | core/java/android/provider/Settings.java | 8 | ||||
| -rw-r--r-- | services/core/java/com/android/server/GestureLauncherService.java | 76 |
2 files changed, 77 insertions, 7 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index fe95864e4172..78be3cd81222 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5712,6 +5712,13 @@ public final class Settings { public static final String ASSISTANT = "assistant"; /** + * Whether the camera launch gesture should be disabled. + * + * @hide + */ + public static final String CAMERA_GESTURE_DISABLED = "camera_gesture_disabled"; + + /** * This are the settings to be backed up. * * NOTE: Settings are backed up and restored in the order they appear @@ -5767,6 +5774,7 @@ public final class Settings { MOUNT_UMS_NOTIFY_ENABLED, SLEEP_TIMEOUT, DOUBLE_TAP_TO_WAKE, + CAMERA_GESTURE_DISABLED, }; /** diff --git a/services/core/java/com/android/server/GestureLauncherService.java b/services/core/java/com/android/server/GestureLauncherService.java index e17ff5cfab1e..1f3d61c34d22 100644 --- a/services/core/java/com/android/server/GestureLauncherService.java +++ b/services/core/java/com/android/server/GestureLauncherService.java @@ -16,21 +16,26 @@ package com.android.server; +import android.app.ActivityManager; import android.app.KeyguardManager; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Resources; +import android.database.ContentObserver; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.os.Handler; import android.os.PowerManager; -import android.os.Vibrator; import android.os.PowerManager.WakeLock; import android.os.SystemProperties; +import android.os.Vibrator; import android.provider.MediaStore; import android.provider.Settings; import android.util.Slog; @@ -56,6 +61,8 @@ class GestureLauncherService extends SystemService { /** The wake lock held when a gesture is detected. */ private WakeLock mWakeLock; + private boolean mRegistered; + private int mUserId; public GestureLauncherService(Context context) { super(context); @@ -81,9 +88,35 @@ class GestureLauncherService extends SystemService { mWakeLock = powerManager.newWakeLock( PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "GestureLauncherService"); - if (isCameraLaunchEnabled(resources)) { - registerCameraLaunchGesture(resources); - } + updateCameraRegistered(); + + mUserId = ActivityManager.getCurrentUser(); + mContext.registerReceiver(mUserReceiver, new IntentFilter(Intent.ACTION_USER_SWITCHED)); + registerContentObserver(); + } + } + + private void registerContentObserver() { + mContext.getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.CAMERA_GESTURE_DISABLED), + false, mSettingObserver, mUserId); + } + + private void updateCameraRegistered() { + Resources resources = mContext.getResources(); + if (isCameraLaunchSettingEnabled(mContext, mUserId)) { + registerCameraLaunchGesture(resources); + } else { + unregisterCameraLaunchGesture(); + } + } + + private void unregisterCameraLaunchGesture() { + if (mRegistered) { + mRegistered = false; + SensorManager sensorManager = (SensorManager) mContext.getSystemService( + Context.SENSOR_SERVICE); + sensorManager.unregisterListener(mGestureListener); } } @@ -91,12 +124,15 @@ class GestureLauncherService extends SystemService { * Registers for the camera launch gesture. */ private void registerCameraLaunchGesture(Resources resources) { + if (mRegistered) { + return; + } SensorManager sensorManager = (SensorManager) mContext.getSystemService( Context.SENSOR_SERVICE); int cameraLaunchGestureId = resources.getInteger( com.android.internal.R.integer.config_cameraLaunchGestureSensorType); if (cameraLaunchGestureId != -1) { - boolean registered = false; + mRegistered = false; String sensorName = resources.getString( com.android.internal.R.string.config_cameraLaunchGestureSensorStringType); mCameraLaunchSensor = sensorManager.getDefaultSensor( @@ -108,7 +144,7 @@ class GestureLauncherService extends SystemService { // makes the code more robust. if (mCameraLaunchSensor != null) { if (sensorName.equals(mCameraLaunchSensor.getStringType())) { - registered = sensorManager.registerListener(mGestureListener, + mRegistered = sensorManager.registerListener(mGestureListener, mCameraLaunchSensor, 0); } else { String message = String.format("Wrong configuration. Sensor type and sensor " @@ -117,12 +153,18 @@ class GestureLauncherService extends SystemService { throw new RuntimeException(message); } } - if (DBG) Slog.d(TAG, "Camera launch sensor registered: " + registered); + if (DBG) Slog.d(TAG, "Camera launch sensor registered: " + mRegistered); } else { if (DBG) Slog.d(TAG, "Camera launch sensor is not specified."); } } + public static boolean isCameraLaunchSettingEnabled(Context context, int userId) { + return isCameraLaunchEnabled(context.getResources()) + && (Settings.Secure.getIntForUser(context.getContentResolver(), + Settings.Secure.CAMERA_GESTURE_DISABLED, 0, userId) == 0); + } + /** * Whether to enable the camera launch gesture. */ @@ -142,6 +184,26 @@ class GestureLauncherService extends SystemService { return isCameraLaunchEnabled(resources); } + private final BroadcastReceiver mUserReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { + mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); + mContext.getContentResolver().unregisterContentObserver(mSettingObserver); + registerContentObserver(); + updateCameraRegistered(); + } + } + }; + + private final ContentObserver mSettingObserver = new ContentObserver(new Handler()) { + public void onChange(boolean selfChange, android.net.Uri uri, int userId) { + if (userId == mUserId) { + updateCameraRegistered(); + } + } + }; + private final class GestureEventListener implements SensorEventListener { @Override public void onSensorChanged(SensorEvent event) { |