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

Commit 45d57157 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Settings: Fix crash when selected accessibility."

parents 58218885 cb908891
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3710,6 +3710,8 @@
    <string name="accessibility_global_gesture_preference_summary_off">Off</string>
    <!--  Description for the preference screen to enable the global geture taht turns on accessibility. [CHAR LIMIT=none] -->
    <string name="accessibility_global_gesture_preference_description">When this feature is turned on, you can quickly enable accessibility features in two steps:\n\nStep 1: Press and hold the power button until you hear a sound or feel a vibration.\n\nStep 2: Touch and hold two fingers until you hear audio confirmation.\n\nIf the device has multiple users, using this shortcut on the lock screen temporarily enables accessibility until the device is unlocked.</string>
    <!-- Title for the accessibility preference to enable LED flashlight -->
    <string name="accessibility_toggle_led_flashlight_preference_title">LED flashlight</string>
    <!-- Title for the accessibility preference to enable large text. [CHAR LIMIT=35] -->
    <string name="accessibility_toggle_large_text_preference_title">Large text</string>
    <!-- Title for the accessibility preference to high contrast text. [CHAR LIMIT=35] -->
+11 −0
Original line number Diff line number Diff line
@@ -48,6 +48,11 @@
                android:summary="@string/experimental_preference"
                android:persistent="false"/>

        <CheckBoxPreference
                android:key="toggle_led_flashlight_preference"
                android:title="@string/accessibility_toggle_led_flashlight_preference_title"
                android:persistent="false"/>

        <CheckBoxPreference
                android:key="toggle_power_button_ends_call_preference"
                android:title="@string/accessibility_power_button_ends_call_prerefence_title"
@@ -63,6 +68,12 @@
                android:title="@string/accessibility_toggle_speak_password_preference_title"
                android:persistent="false"/>

       <CheckBoxPreference
                android:key="toggle_enable_quickboot_preference"
                android:title="@string/enable_quickboot_title"
                android:summary="@string/enable_quickboot_summary"
                android:persistent="false"/>

        <PreferenceScreen
                android:fragment="com.android.settings.accessibility.ToggleGlobalGesturePreferenceFragment"
                android:key="enable_global_gesture_preference_screen"
+69 −45
Original line number Diff line number Diff line
@@ -108,7 +108,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
            "screen_magnification_preference_screen";
    private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
            "daltonizer_preference_screen";
    private static final String ENABLE_QUICKBOOT= "enable_quickboot";
    private static final String TOGGLE_ENABLE_QUICKBOOT_PREFERENCE =
            "toggle_enable_quickboot_preference";

    // Extras passed to sub-fragments.
    static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -125,6 +126,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    // presentation.
    private static final long DELAY_UPDATE_SERVICES_MILLIS = 1000;

    private static final String ENABLE_QUICKBOOT = "enable_quickboot";

    // Auxiliary members.
    final static SimpleStringSplitter sStringColonSplitter =
            new SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);
@@ -136,8 +139,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements

    private final Configuration mCurConfig = new Configuration();

    private static boolean mLightsOn = false;

    private final Handler mHandler = new Handler();

    private final Runnable mUpdateRunnable = new Runnable() {
@@ -194,7 +195,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    private PreferenceCategory mServicesCategory;
    private PreferenceCategory mSystemsCategory;

    private CheckBoxPreference mQuickBoot;
    private CheckBoxPreference mQuickBootPreference;
    private CheckBoxPreference mToggleLargeTextPreference;
    private CheckBoxPreference mToggleLEDflashlightPreference;
    private CheckBoxPreference mToggleHighTextContrastPreference;
@@ -210,10 +211,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    private SwitchPreference mToggleInversionPreference;

    private int mLongPressTimeoutDefault;
    private boolean mShowQuickBoot = false;

    private DevicePolicyManager mDpm;

    // Customize quick enbale
    private boolean mQuickBootEnable = false;
    // Customize led flashlight
    private boolean mLedFlashLightEnable = false;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
@@ -277,13 +282,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        if (mToggleLargeTextPreference == preference) {
            handleToggleLargeTextPreferenceClick();
            return true;
        } else if (mToggleLEDflashlightPreference != null
                && mToggleLEDflashlightPreference == preference) {
            handleToggleLEDflashlightPreferenceClick();
            return true;
        } else if (mToggleHighTextContrastPreference == preference) {
            handleToggleTextContrastPreferenceClick();
            return true;
        } else if (mLedFlashLightEnable &&
                mToggleLEDflashlightPreference == preference) {
            handleToggleLEDflashlightPreferenceClick();
            return true;
        } else if (mTogglePowerButtonEndsCallPreference == preference) {
            handleTogglePowerButtonEndsCallPreferenceClick();
            return true;
@@ -293,24 +298,27 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        } else if (mToggleSpeakPasswordPreference == preference) {
            handleToggleSpeakPasswordPreferenceClick();
            return true;
        } else if (mQuickBootEnable &&
                mQuickBootPreference == preference) {
            Settings.System.putInt(getActivity().getContentResolver(),
                    ENABLE_QUICKBOOT,
                    mQuickBootPreference.isChecked() ? 1 : 0);
            return true;
        } else if (mGlobalGesturePreferenceScreen == preference) {
            handleToggleEnableAccessibilityGesturePreferenceClick();
            return true;
        } else if (mDisplayMagnificationPreferenceScreen == preference) {
            handleDisplayMagnificationPreferenceScreenClick();
            return true;
        } else if (preference == mQuickBoot) {
            Settings.System.putInt(getActivity().getContentResolver(), ENABLE_QUICKBOOT,
                    mQuickBoot.isChecked() ? 1 : 0);
            return true;
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

    private void handleToggleLEDflashlightPreferenceClick() {
        mLightsOn = mToggleLEDflashlightPreference.isChecked() ? true : false;
        boolean isLightsOn = mToggleLEDflashlightPreference.isChecked() ? true : false;
        Intent intent = new Intent(getActivity(), LedFlashlightReceiver.class);
        intent.putExtra(LedFlashlightReceiver.LED_SWITCH, mLightsOn);
        intent.setAction(LedFlashlightReceiver.LED_SWITCH_ACTION);
        intent.putExtra(LedFlashlightReceiver.LED_SWITCH, isLightsOn);
        getActivity().sendBroadcast(intent);
    }

@@ -321,25 +329,35 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        } else {
            brightness = getLEDFlashBrightness(LedFlashlightReceiver.COMMON_FLASHLIGHT_BRIGHTNESS);
        }
        if (brightness != null && !brightness.equals("0")) {
            return true;
        } else {

        if (brightness == null || brightness.equals("0")) {
            return false;
        }

        return true;
    }

    private String getLEDFlashBrightness(String node) {
        FileInputStream driver = null;
        try {
            FileInputStream fileinputStream = new FileInputStream(new File(node));
            driver = new FileInputStream(new File(node));
            byte[] brightnessByte = new byte[1];
            fileinputStream.read(brightnessByte, 0, 1);
            fileinputStream.close();
            driver.read(brightnessByte, 0, 1);
            return new String(brightnessByte);
        } catch (FileNotFoundException e) {
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (driver != null) {
                    driver.close();
                }
            }catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }

@@ -409,24 +427,11 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    private void initializeAllPreferences() {
        mServicesCategory = (PreferenceCategory) findPreference(SERVICES_CATEGORY);
        mSystemsCategory = (PreferenceCategory) findPreference(SYSTEM_CATEGORY);
        mShowQuickBoot = getResources().getBoolean(R.bool.def_quick_boot_enable);
        mQuickBoot = (CheckBoxPreference) findPreference(ENABLE_QUICKBOOT);
        if (!mShowQuickBoot && mQuickBoot!=null ) {
            mSystemsCategory.removePreference(mQuickBoot);
        }

        // Large text.
        mToggleLargeTextPreference =
                (CheckBoxPreference) findPreference(TOGGLE_LARGE_TEXT_PREFERENCE);

         // LED flashlight.
         mToggleLEDflashlightPreference =
                    (CheckBoxPreference) findPreference(TOGGLE_LED_FLASHLIGHT_PREFERENCE);
        if (!getResources().getBoolean(R.bool.def_led_flashlight_enable)
                && mToggleLEDflashlightPreference != null) {
            mSystemsCategory.removePreference(mToggleLEDflashlightPreference);
        }

        // Text contrast.
        mToggleHighTextContrastPreference =
                (CheckBoxPreference) findPreference(TOGGLE_HIGH_TEXT_CONTRAST_PREFERENCE);
@@ -435,6 +440,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        mToggleInversionPreference = (SwitchPreference) findPreference(TOGGLE_INVERSION_PREFERENCE);
        mToggleInversionPreference.setOnPreferenceChangeListener(this);

        // LED flashlight.
        mLedFlashLightEnable = getResources().getBoolean(R.bool.def_led_flashlight_enable);
        mToggleLEDflashlightPreference =
                (CheckBoxPreference) findPreference(TOGGLE_LED_FLASHLIGHT_PREFERENCE);
        if (!mLedFlashLightEnable && mToggleLEDflashlightPreference != null) {
            mSystemsCategory.removePreference(mToggleLEDflashlightPreference);
        }

        // Power button ends calls.
        mTogglePowerButtonEndsCallPreference =
                (CheckBoxPreference) findPreference(TOGGLE_POWER_BUTTON_ENDS_CALL_PREFERENCE);
@@ -454,6 +467,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        mToggleSpeakPasswordPreference =
                (CheckBoxPreference) findPreference(TOGGLE_SPEAK_PASSWORD_PREFERENCE);

        // Qucik boot.
        mQuickBootEnable = getResources().getBoolean(R.bool.def_quick_boot_enable);
        mQuickBootPreference =
                (CheckBoxPreference) findPreference(TOGGLE_ENABLE_QUICKBOOT_PREFERENCE);
        if (!mQuickBootEnable && mQuickBootPreference != null) {
            mSystemsCategory.removePreference(mQuickBootPreference);
        }

        // Long press timeout.
        mSelectLongPressTimeoutPreference =
                (ListPreference) findPreference(SELECT_LONG_PRESS_TIMEOUT_PREFERENCE);
@@ -601,11 +622,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    }

    private void updateSystemPreferences() {
        if (mQuickBoot != null) {
            mQuickBoot.setChecked(Settings.System.getInt(getActivity().getContentResolver(),
                ENABLE_QUICKBOOT, 0) != 0);
        }

        // Large text.
        try {
            mCurConfig.updateFrom(ActivityManagerNative.getDefault().getConfiguration());
@@ -614,11 +630,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        }
        mToggleLargeTextPreference.setChecked(mCurConfig.fontScale == LARGE_FONT_SCALE);

        if (mToggleLEDflashlightPreference != null) {
            mLightsOn = getLEDStatus();
            mToggleLEDflashlightPreference.setChecked(mLightsOn);
        }

        mToggleHighTextContrastPreference.setChecked(
                Settings.Secure.getInt(getContentResolver(),
                        Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0) == 1);
@@ -627,6 +638,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        mToggleInversionPreference.setChecked(Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0) == 1);

        // LED flashlight.
        if (mLedFlashLightEnable) {
            boolean isLightsOn = getLEDStatus();
            mToggleLEDflashlightPreference.setChecked(isLightsOn);
        }

        // Power button ends calls.
        if (KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_POWER)
                && Utils.isVoiceCapable(getActivity())) {
@@ -646,6 +663,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
                Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0) != 0;
        mToggleSpeakPasswordPreference.setChecked(speakPasswordEnabled);

        // Qucik boot.
        if (mQuickBootEnable) {
            mQuickBootPreference.setChecked(
                    Settings.System.getInt(getActivity().getContentResolver(),
                    ENABLE_QUICKBOOT, 0) != 0);
        }

        // Long press timeout.
        final int longPressTimeout = Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.LONG_PRESS_TIMEOUT, mLongPressTimeoutDefault);
+59 −37
Original line number Diff line number Diff line
@@ -40,21 +40,23 @@ import java.io.FileOutputStream;
import java.io.IOException;

public class LedFlashlightReceiver extends BroadcastReceiver {
    private static final String LOG_TAG = "LedFlashlightReceiver";
    public static final String LED_SWITCH = "LedSwitch";
    public static final String LED_SWITCH_ACTION = "android.intent.action.ACTION_SHUTDOWN";
    private static final String TAG = "LedFlashlightReceiver";
    // LED light on/off values.
    private static final byte[] LIGHTE_ON = {
            '1', '2', '7'
    };
    private static final byte[] LIGHTE_OFF = {
            '0'
    };
    private static final byte[] LIGHT_TORCH = {
    private static final byte[] LIGHTE_ON = {
            '1', '2', '7'
    };
    private static final byte[] LIGHT_MODE_TORCH = {
            '1'
    };
    private static final byte[] LIGHT_DEFAULT = {
    private static final byte[] LIGHT_MODE_DEFAULT = {
            '0'
    };

    // LED node used in different chipsets
    public final static String MSM8226_FLASHLIGHT_BRIGHTNESS =
            "/sys/class/leds/torch-light/brightness";
@@ -62,54 +64,48 @@ public class LedFlashlightReceiver extends BroadcastReceiver {
            "/sys/class/leds/flashlight/brightness";
    public final static String COMMON_FLASHLIGHT_MODE =
            "/sys/class/leds/flashlight/mode";
    private static boolean mLightsOn = false;
    private static PowerManager.WakeLock mWakeLock;

    @Override
    public void onReceive(Context context, Intent intent) {
        mLightsOn = intent.getBooleanExtra(LED_SWITCH, false);
        setLEDStatus(mLightsOn);
        if (intent != null &&
                LED_SWITCH_ACTION.equals(intent.getAction())) {
            boolean isLightsOn = intent.getBooleanExtra(LED_SWITCH, false);
            setLEDWakeLock(context, isLightsOn);
            setLEDStatus(isLightsOn);
        }
    }

    private void setLEDStatus(boolean status) {
        Log.d(LOG_TAG, "setLEDStatus(" + status + ")");
        if (mWakeLock != null && status) {
            mWakeLock.acquire();
        } else if (mWakeLock != null && !status) {
            mWakeLock.release();
        }
        byte[] data = status ? LIGHTE_ON : LIGHTE_OFF;
        // for MSM8x26, BSP add MSM8226_TORCH_NODE for control torch brightness
        if (isFileExists(MSM8226_FLASHLIGHT_BRIGHTNESS)) {
            changeLEDFlashBrightness(status, MSM8226_FLASHLIGHT_BRIGHTNESS);
            setLEDFlashDataToDriver(MSM8226_FLASHLIGHT_BRIGHTNESS, data);
        } else {
            changeLEDFlashMode(status, COMMON_FLASHLIGHT_MODE);
            changeLEDFlashBrightness(status, COMMON_FLASHLIGHT_BRIGHTNESS);
            byte[] mode = status ? LIGHT_MODE_TORCH : LIGHT_MODE_DEFAULT;
            setLEDFlashDataToDriver(COMMON_FLASHLIGHT_MODE, mode);
            setLEDFlashDataToDriver(COMMON_FLASHLIGHT_BRIGHTNESS, data);
        }
    }

    private void changeLEDFlashMode(boolean status, String node) {
    private void setLEDFlashDataToDriver(String node, byte[] data) {
        FileOutputStream driver = null;
        try {
            byte[] ledMode = status ? LIGHT_TORCH : LIGHT_DEFAULT;
            FileOutputStream mode = new FileOutputStream(node);
            mode.write(ledMode);
            mode.close();
            driver = new FileOutputStream(node);
            driver.write(data);
        } catch (FileNotFoundException e) {
            Log.d(LOG_TAG, e.toString());
            Log.d(TAG, e.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void changeLEDFlashBrightness(boolean status, String node) {
        } finally {
            try {
            byte[] ledData = status ? LIGHTE_ON : LIGHTE_OFF;
            FileOutputStream brightness = new FileOutputStream(node);
            brightness.write(ledData);
            brightness.close();
        } catch (FileNotFoundException e) {
            Log.d(LOG_TAG, e.toString());
                if (driver != null) {
                    driver.flush();
                    driver.close();
                }
            } catch (IOException e) {
            e.printStackTrace();
                Log.e(TAG, "Error closing file: " + e.toString());
            }
        }
    }

@@ -117,4 +113,30 @@ public class LedFlashlightReceiver extends BroadcastReceiver {
        File file = new File(filePath);
        return file.exists();
    }

    private void acquireLEDWakeLock(Context context) {
        if (mWakeLock == null && context != null) {
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
            mWakeLock.setReferenceCounted(false);
            mWakeLock.acquire();
        }
    }

    private void releaseLEDWakeLock() {
        if (mWakeLock != null) {
            if (mWakeLock.isHeld()) {
                mWakeLock.release();
            }
            mWakeLock = null;
        }
    }

    private void setLEDWakeLock(Context context, boolean isLightsOn) {
        if (isLightsOn) {
            acquireLEDWakeLock(context);
        } else {
            releaseLEDWakeLock();
        }
    }
}