Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84e6fa99 authored by Sam Mortimer's avatar Sam Mortimer
Browse files

[1/3] Torch long press power: add auto-off function

Change-Id: Icdf50082324f8292859f0df8b271e730b02c84e7
parent 45703849
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -517,6 +517,10 @@
    <protected-broadcast android:name="com.android.server.retaildemo.ACTION_RESET_DEMO" />

    <protected-broadcast android:name="cyanogenmod.intent.action.LID_STATE_CHANGED" />

    <protected-broadcast
            android:name="com.android.server.policy.PhoneWindowManager.ACTION_TORCH_OFF" />

    <!-- ====================================================================== -->
    <!--                          RUNTIME PERMISSIONS                           -->
    <!-- ====================================================================== -->
+67 −9
Original line number Diff line number Diff line
@@ -43,8 +43,10 @@ import android.app.ActivityManager.StackId;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal.SleepToken;
import android.app.ActivityManagerNative;
import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.IUiModeManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.app.SearchManager;
import android.app.StatusBarManager;
@@ -335,6 +337,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private static final int NAV_BAR_RIGHT = 1;
    private static final int NAV_BAR_LEFT = 2;

    private static final String ACTION_TORCH_OFF =
            "com.android.server.policy.PhoneWindowManager.ACTION_TORCH_OFF";

    /**
     * Keyguard stuff
     */
@@ -396,6 +401,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    AccessibilityManager mAccessibilityManager;
    BurnInProtectionHelper mBurnInProtectionHelper;
    AppOpsManager mAppOpsManager;
    AlarmManager mAlarmManager;
    private boolean mHasFeatureWatch;

    // Vibrator pattern for haptic feedback of a long press.
@@ -885,6 +891,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private String mRearFlashCameraId;
    private boolean mTorchLongPressPowerEnabled;
    private boolean mTorchEnabled;
    private int mTorchTimeout;
    private PendingIntent mTorchOffPendingIntent;

    int mDesiredRotation = -1;

@@ -969,15 +977,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    break;
                }
                case MSG_TOGGLE_TORCH: {
                    try {
                        final String rearFlashCameraId = getRearFlashCameraId();
                        if (rearFlashCameraId != null) {
                            mCameraManager.setTorchMode(rearFlashCameraId, !mTorchEnabled);
                            mTorchEnabled = !mTorchEnabled;
                        }
                    } catch (CameraAccessException e) {
                        // Ignore
                    }
                    toggleTorch();
                    break;
                }
                case MSG_BACK_DELAYED_PRESS:
@@ -1015,6 +1015,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            resolver.registerContentObserver(CMSettings.System.getUriFor(
                    CMSettings.System.TORCH_LONG_PRESS_POWER_GESTURE), false, this,
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(CMSettings.System.getUriFor(
                    CMSettings.System.TORCH_LONG_PRESS_POWER_TIMEOUT), false, this,
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(Settings.Secure.getUriFor(
                    Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR), false, this,
                    UserHandle.USER_ALL);
@@ -1951,6 +1954,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
        mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
        mHasFeatureWatch = mContext.getPackageManager().hasSystemFeature(FEATURE_WATCH);
        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        // Init display burn-in protection
        boolean burnInProtectionEnabled = context.getResources().getBoolean(
@@ -2248,6 +2252,23 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
        }
        if (DEBUG) Slog.d(TAG, "" + mDeviceKeyHandlers.size() + " device key handlers loaded");

        // Register for torch off events
        BroadcastReceiver torchReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                mTorchOffPendingIntent = null;
                if (mTorchEnabled) {
                    mHandler.removeMessages(MSG_TOGGLE_TORCH);
                    Message msg = mHandler.obtainMessage(MSG_TOGGLE_TORCH);
                    msg.setAsynchronous(true);
                    msg.sendToTarget();
                }
            }
        };
        filter = new IntentFilter();
        filter.addAction(ACTION_TORCH_OFF);
        context.registerReceiver(torchReceiver, filter);
    }

    private void updateKeyAssignments() {
@@ -2462,6 +2483,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            mTorchLongPressPowerEnabled = CMSettings.System.getIntForUser(
                    resolver, CMSettings.System.TORCH_LONG_PRESS_POWER_GESTURE, 0,
                    UserHandle.USER_CURRENT) == 1;
            mTorchTimeout = CMSettings.System.getIntForUser(
                    resolver, CMSettings.System.TORCH_LONG_PRESS_POWER_TIMEOUT, 0,
                    UserHandle.USER_CURRENT);
            mHomeWakeScreen = (CMSettings.System.getIntForUser(resolver,
                    CMSettings.System.HOME_WAKE_SCREEN, 1, UserHandle.USER_CURRENT) == 1) &&
                    ((mDeviceHardwareWakeKeys & KEY_MASK_HOME) != 0);
@@ -9138,6 +9162,36 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private void cancelTorchOff() {
        if (mTorchOffPendingIntent != null) {
            mAlarmManager.cancel(mTorchOffPendingIntent);
            mTorchOffPendingIntent = null;
        }
    }

    private void toggleTorch() {
        cancelTorchOff();
        final boolean origEnabled = mTorchEnabled;
        try {
            final String rearFlashCameraId = getRearFlashCameraId();
            if (rearFlashCameraId != null) {
                mCameraManager.setTorchMode(rearFlashCameraId, !mTorchEnabled);
                mTorchEnabled = !mTorchEnabled;
            }
        } catch (CameraAccessException e) {
            // Ignore
        }
        // Setup torch off alarm
        if (mTorchEnabled && !origEnabled && mTorchTimeout > 0) {
            Intent torchOff = new Intent(ACTION_TORCH_OFF);
            torchOff.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
                    | Intent.FLAG_RECEIVER_FOREGROUND);
            mTorchOffPendingIntent = PendingIntent.getBroadcast(mContext, 0, torchOff, 0);
            mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                    SystemClock.elapsedRealtime() + mTorchTimeout * 1000, mTorchOffPendingIntent);
        }
    }

    private String getRearFlashCameraId() throws CameraAccessException {
        if (mRearFlashCameraId != null) return mRearFlashCameraId;
        for (final String id : mCameraManager.getCameraIdList()) {
@@ -9156,12 +9210,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        public void onTorchModeChanged(String cameraId, boolean enabled) {
            if (!cameraId.equals(mRearFlashCameraId)) return;
            mTorchEnabled = enabled;
            if (!mTorchEnabled) {
                cancelTorchOff();
            }
        }

        @Override
        public void onTorchModeUnavailable(String cameraId) {
            if (!cameraId.equals(mRearFlashCameraId)) return;
            mTorchEnabled = false;
            cancelTorchOff();
        }
    }