PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/DeviceHandler/src/com/slim/device/settings/ScreenOffGesture.java

https://gitlab.com/LiquidSmooth-Devices/device_oppo_common
Java | 393 lines | 326 code | 47 blank | 20 comment | 62 complexity | 34f1322617470c253e5a16c2258ebcfe MD5 | raw file
  1. /*
  2. * Copyright (C) 2014 Slimroms
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.slim.device.settings;
  17. import android.app.Activity;
  18. import android.app.AlertDialog;
  19. import android.app.Dialog;
  20. import android.app.DialogFragment;
  21. import android.content.DialogInterface;
  22. import android.content.Intent;
  23. import android.content.pm.PackageManager;
  24. import android.content.res.Resources;
  25. import android.content.SharedPreferences;
  26. import android.graphics.Bitmap;
  27. import android.os.Bundle;
  28. import android.preference.CheckBoxPreference;
  29. import android.preference.Preference;
  30. import android.preference.Preference.OnPreferenceChangeListener;
  31. import android.preference.Preference.OnPreferenceClickListener;
  32. import android.preference.PreferenceFragment;
  33. import android.preference.PreferenceScreen;
  34. import android.view.Menu;
  35. import android.view.MenuInflater;
  36. import android.view.MenuItem;
  37. import com.android.internal.util.slim.AppHelper;
  38. import com.android.internal.util.slim.ActionConstants;
  39. import com.android.internal.util.slim.DeviceUtils;
  40. import com.android.internal.util.slim.DeviceUtils.FilteredDeviceFeaturesArray;
  41. import com.slim.device.KernelControl;
  42. import com.slim.device.R;
  43. import com.slim.device.util.ShortcutPickerHelper;
  44. public class ScreenOffGesture extends PreferenceFragment implements
  45. OnPreferenceChangeListener, OnPreferenceClickListener,
  46. ShortcutPickerHelper.OnPickListener {
  47. private static final String SETTINGS_METADATA_NAME = "com.android.settings";
  48. public static final String GESTURE_SETTINGS = "screen_off_gesture_settings";
  49. public static final String PREF_GESTURE_ENABLE = "enable_gestures";
  50. public static final String PREF_GESTURE_CIRCLE = "gesture_circle";
  51. public static final String PREF_GESTURE_DOUBLE_SWIPE = "gesture_double_swipe";
  52. public static final String PREF_GESTURE_ARROW_UP = "gesture_arrow_up";
  53. public static final String PREF_GESTURE_ARROW_DOWN = "gesture_arrow_down";
  54. public static final String PREF_GESTURE_ARROW_LEFT = "gesture_arrow_left";
  55. public static final String PREF_GESTURE_ARROW_RIGHT = "gesture_arrow_right";
  56. public static final String PREF_GESTURE_DOUBLE_TAP = "gesture_double_tap";
  57. private static final int DLG_SHOW_ACTION_DIALOG = 0;
  58. private static final int DLG_RESET_TO_DEFAULT = 1;
  59. private static final int MENU_RESET = Menu.FIRST;
  60. private Preference mGestureCircle;
  61. private Preference mGestureDoubleSwipe;
  62. private Preference mGestureArrowUp;
  63. private Preference mGestureArrowDown;
  64. private Preference mGestureArrowLeft;
  65. private Preference mGestureArrowRight;
  66. private Preference mGestureDoubleTap;
  67. private CheckBoxPreference mEnableGestures;
  68. private boolean mCheckPreferences;
  69. private SharedPreferences mScreenOffGestureSharedPreferences;
  70. private ShortcutPickerHelper mPicker;
  71. private String mPendingSettingsKey;
  72. private static FilteredDeviceFeaturesArray sFinalActionDialogArray;
  73. @Override
  74. public void onCreate(Bundle savedInstanceState) {
  75. super.onCreate(savedInstanceState);
  76. mPicker = new ShortcutPickerHelper(getActivity(), this);
  77. mScreenOffGestureSharedPreferences = getActivity().getSharedPreferences(
  78. GESTURE_SETTINGS, Activity.MODE_PRIVATE);
  79. // Before we start filter out unsupported options on the
  80. // ListPreference values and entries
  81. PackageManager pm = getActivity().getPackageManager();
  82. Resources settingsResources = null;
  83. try {
  84. settingsResources = pm.getResourcesForApplication(SETTINGS_METADATA_NAME);
  85. } catch (Exception e) {
  86. return;
  87. }
  88. sFinalActionDialogArray = new FilteredDeviceFeaturesArray();
  89. sFinalActionDialogArray = DeviceUtils.filterUnsupportedDeviceFeatures(getActivity(),
  90. settingsResources.getStringArray(
  91. settingsResources.getIdentifier(SETTINGS_METADATA_NAME
  92. + ":array/shortcut_action_screen_off_values", null, null)),
  93. settingsResources.getStringArray(
  94. settingsResources.getIdentifier(SETTINGS_METADATA_NAME
  95. + ":array/shortcut_action_screen_off_entries", null, null)));
  96. // Attach final settings screen.
  97. reloadSettings();
  98. setHasOptionsMenu(true);
  99. }
  100. private PreferenceScreen reloadSettings() {
  101. mCheckPreferences = false;
  102. PreferenceScreen prefs = getPreferenceScreen();
  103. if (prefs != null) {
  104. prefs.removeAll();
  105. }
  106. // Load the preferences from an XML resource
  107. addPreferencesFromResource(R.xml.screen_off_gesture);
  108. prefs = getPreferenceScreen();
  109. mEnableGestures = (CheckBoxPreference) prefs.findPreference(PREF_GESTURE_ENABLE);
  110. mGestureCircle = (Preference) prefs.findPreference(PREF_GESTURE_CIRCLE);
  111. mGestureDoubleSwipe = (Preference) prefs.findPreference(PREF_GESTURE_DOUBLE_SWIPE);
  112. mGestureArrowUp = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_UP);
  113. mGestureArrowDown = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_DOWN);
  114. mGestureArrowLeft = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_LEFT);
  115. mGestureArrowRight = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_RIGHT);
  116. mGestureDoubleTap = (Preference) prefs.findPreference(PREF_GESTURE_DOUBLE_TAP);
  117. setupOrUpdatePreference(mGestureCircle, mScreenOffGestureSharedPreferences
  118. .getString(PREF_GESTURE_CIRCLE, ActionConstants.ACTION_CAMERA));
  119. setupOrUpdatePreference(mGestureDoubleSwipe, mScreenOffGestureSharedPreferences
  120. .getString(PREF_GESTURE_DOUBLE_SWIPE, ActionConstants.ACTION_MEDIA_PLAY_PAUSE));
  121. if (KernelControl.isArrowUpSupported()) {
  122. setupOrUpdatePreference(mGestureArrowUp, mScreenOffGestureSharedPreferences
  123. .getString(PREF_GESTURE_ARROW_UP, ActionConstants.ACTION_TORCH));
  124. } else {
  125. prefs.removePreference(mGestureArrowUp);
  126. }
  127. setupOrUpdatePreference(mGestureArrowDown, mScreenOffGestureSharedPreferences
  128. .getString(PREF_GESTURE_ARROW_DOWN, ActionConstants.ACTION_VIB_SILENT));
  129. setupOrUpdatePreference(mGestureArrowLeft, mScreenOffGestureSharedPreferences
  130. .getString(PREF_GESTURE_ARROW_LEFT, ActionConstants.ACTION_MEDIA_PREVIOUS));
  131. setupOrUpdatePreference(mGestureArrowRight, mScreenOffGestureSharedPreferences
  132. .getString(PREF_GESTURE_ARROW_RIGHT, ActionConstants.ACTION_MEDIA_NEXT));
  133. setupOrUpdatePreference(mGestureDoubleTap, mScreenOffGestureSharedPreferences
  134. .getString(PREF_GESTURE_DOUBLE_TAP, ActionConstants.ACTION_WAKE_DEVICE));
  135. boolean enableGestures =
  136. mScreenOffGestureSharedPreferences.getBoolean(PREF_GESTURE_ENABLE, true);
  137. mEnableGestures.setChecked(enableGestures);
  138. mEnableGestures.setOnPreferenceChangeListener(this);
  139. mCheckPreferences = true;
  140. return prefs;
  141. }
  142. private void setupOrUpdatePreference(Preference preference, String action) {
  143. if (preference == null || action == null) {
  144. return;
  145. }
  146. if (action.startsWith("**")) {
  147. preference.setSummary(getDescription(action));
  148. } else {
  149. preference.setSummary(AppHelper.getFriendlyNameForUri(
  150. getActivity(), getActivity().getPackageManager(), action));
  151. }
  152. preference.setOnPreferenceClickListener(this);
  153. }
  154. private String getDescription(String action) {
  155. if (sFinalActionDialogArray == null || action == null) {
  156. return null;
  157. }
  158. int i = 0;
  159. for (String actionValue : sFinalActionDialogArray.values) {
  160. if (action.equals(actionValue)) {
  161. return sFinalActionDialogArray.entries[i];
  162. }
  163. i++;
  164. }
  165. return null;
  166. }
  167. @Override
  168. public boolean onPreferenceClick(Preference preference) {
  169. String settingsKey = null;
  170. int dialogTitle = 0;
  171. if (preference == mGestureCircle) {
  172. settingsKey = PREF_GESTURE_CIRCLE;
  173. dialogTitle = R.string.gesture_circle_title;
  174. } else if (preference == mGestureDoubleSwipe) {
  175. settingsKey = PREF_GESTURE_DOUBLE_SWIPE;
  176. dialogTitle = R.string.gesture_double_swipe_title;
  177. } else if (preference == mGestureArrowUp) {
  178. settingsKey = PREF_GESTURE_ARROW_UP;
  179. dialogTitle = R.string.gesture_arrow_up_title;
  180. } else if (preference == mGestureArrowDown) {
  181. settingsKey = PREF_GESTURE_ARROW_DOWN;
  182. dialogTitle = R.string.gesture_arrow_down_title;
  183. } else if (preference == mGestureArrowLeft) {
  184. settingsKey = PREF_GESTURE_ARROW_LEFT;
  185. dialogTitle = R.string.gesture_arrow_left_title;
  186. } else if (preference == mGestureArrowRight) {
  187. settingsKey = PREF_GESTURE_ARROW_RIGHT;
  188. dialogTitle = R.string.gesture_arrow_right_title;
  189. } else if (preference == mGestureDoubleTap) {
  190. settingsKey = PREF_GESTURE_DOUBLE_TAP;
  191. dialogTitle = R.string.gesture_double_tap_title;
  192. }
  193. if (settingsKey != null) {
  194. showDialogInner(DLG_SHOW_ACTION_DIALOG, settingsKey, dialogTitle);
  195. return true;
  196. }
  197. return false;
  198. }
  199. @Override
  200. public boolean onPreferenceChange(Preference preference, Object newValue) {
  201. if (!mCheckPreferences) {
  202. return false;
  203. }
  204. if (preference == mEnableGestures) {
  205. mScreenOffGestureSharedPreferences.edit()
  206. .putBoolean(PREF_GESTURE_ENABLE, (Boolean) newValue).commit();
  207. KernelControl.enableGestures((Boolean) newValue);
  208. return true;
  209. }
  210. return false;
  211. }
  212. // Reset all entries to default.
  213. private void resetToDefault() {
  214. SharedPreferences.Editor editor = mScreenOffGestureSharedPreferences.edit();
  215. mScreenOffGestureSharedPreferences.edit()
  216. .putBoolean(PREF_GESTURE_ENABLE, true).commit();
  217. editor.putString(PREF_GESTURE_CIRCLE,
  218. ActionConstants.ACTION_CAMERA).commit();
  219. editor.putString(PREF_GESTURE_DOUBLE_SWIPE,
  220. ActionConstants.ACTION_MEDIA_PLAY_PAUSE).commit();
  221. editor.putString(PREF_GESTURE_ARROW_UP,
  222. ActionConstants.ACTION_TORCH).commit();
  223. editor.putString(PREF_GESTURE_ARROW_DOWN,
  224. ActionConstants.ACTION_VIB_SILENT).commit();
  225. editor.putString(PREF_GESTURE_ARROW_LEFT,
  226. ActionConstants.ACTION_MEDIA_PREVIOUS).commit();
  227. editor.putString(PREF_GESTURE_ARROW_RIGHT,
  228. ActionConstants.ACTION_MEDIA_NEXT).commit();
  229. editor.putString(PREF_GESTURE_DOUBLE_TAP,
  230. ActionConstants.ACTION_WAKE_DEVICE).commit();
  231. editor.commit();
  232. KernelControl.enableGestures(true);
  233. reloadSettings();
  234. }
  235. @Override
  236. public void onResume() {
  237. super.onResume();
  238. }
  239. @Override
  240. public void shortcutPicked(String action,
  241. String description, Bitmap bmp, boolean isApplication) {
  242. if (mPendingSettingsKey == null || action == null) {
  243. return;
  244. }
  245. mScreenOffGestureSharedPreferences.edit().putString(mPendingSettingsKey, action).commit();
  246. reloadSettings();
  247. mPendingSettingsKey = null;
  248. }
  249. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  250. if (resultCode == Activity.RESULT_OK) {
  251. if (requestCode == ShortcutPickerHelper.REQUEST_PICK_SHORTCUT
  252. || requestCode == ShortcutPickerHelper.REQUEST_PICK_APPLICATION
  253. || requestCode == ShortcutPickerHelper.REQUEST_CREATE_SHORTCUT) {
  254. mPicker.onActivityResult(requestCode, resultCode, data);
  255. }
  256. } else {
  257. mPendingSettingsKey = null;
  258. }
  259. super.onActivityResult(requestCode, resultCode, data);
  260. }
  261. @Override
  262. public boolean onOptionsItemSelected(MenuItem item) {
  263. switch (item.getItemId()) {
  264. case MENU_RESET:
  265. showDialogInner(DLG_RESET_TO_DEFAULT, null, 0);
  266. break;
  267. }
  268. return super.onOptionsItemSelected(item);
  269. }
  270. @Override
  271. public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  272. menu.add(0, MENU_RESET, 0, R.string.reset)
  273. .setIcon(R.drawable.ic_settings_reset)
  274. .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
  275. }
  276. private void showDialogInner(int id, String settingsKey, int dialogTitle) {
  277. DialogFragment newFragment =
  278. MyAlertDialogFragment.newInstance(id, settingsKey, dialogTitle);
  279. newFragment.setTargetFragment(this, 0);
  280. newFragment.show(getFragmentManager(), "dialog " + id);
  281. }
  282. public static class MyAlertDialogFragment extends DialogFragment {
  283. public static MyAlertDialogFragment newInstance(
  284. int id, String settingsKey, int dialogTitle) {
  285. MyAlertDialogFragment frag = new MyAlertDialogFragment();
  286. Bundle args = new Bundle();
  287. args.putInt("id", id);
  288. args.putString("settingsKey", settingsKey);
  289. args.putInt("dialogTitle", dialogTitle);
  290. frag.setArguments(args);
  291. return frag;
  292. }
  293. ScreenOffGesture getOwner() {
  294. return (ScreenOffGesture) getTargetFragment();
  295. }
  296. @Override
  297. public Dialog onCreateDialog(Bundle savedInstanceState) {
  298. int id = getArguments().getInt("id");
  299. final String settingsKey = getArguments().getString("settingsKey");
  300. int dialogTitle = getArguments().getInt("dialogTitle");
  301. switch (id) {
  302. case DLG_SHOW_ACTION_DIALOG:
  303. if (sFinalActionDialogArray == null) {
  304. return null;
  305. }
  306. return new AlertDialog.Builder(getActivity())
  307. .setTitle(dialogTitle)
  308. .setNegativeButton(R.string.cancel, null)
  309. .setItems(getOwner().sFinalActionDialogArray.entries,
  310. new DialogInterface.OnClickListener() {
  311. public void onClick(DialogInterface dialog, int item) {
  312. if (getOwner().sFinalActionDialogArray.values[item]
  313. .equals(ActionConstants.ACTION_APP)) {
  314. if (getOwner().mPicker != null) {
  315. getOwner().mPendingSettingsKey = settingsKey;
  316. getOwner().mPicker.pickShortcut(getOwner().getId());
  317. }
  318. } else {
  319. getOwner().mScreenOffGestureSharedPreferences.edit()
  320. .putString(settingsKey,
  321. getOwner().sFinalActionDialogArray.values[item]).commit();
  322. getOwner().reloadSettings();
  323. }
  324. }
  325. })
  326. .create();
  327. case DLG_RESET_TO_DEFAULT:
  328. return new AlertDialog.Builder(getActivity())
  329. .setTitle(R.string.reset)
  330. .setMessage(R.string.reset_message)
  331. .setNegativeButton(R.string.cancel, null)
  332. .setPositiveButton(R.string.dlg_ok,
  333. new DialogInterface.OnClickListener() {
  334. public void onClick(DialogInterface dialog, int which) {
  335. getOwner().resetToDefault();
  336. }
  337. })
  338. .create();
  339. }
  340. throw new IllegalArgumentException("unknown id " + id);
  341. }
  342. @Override
  343. public void onCancel(DialogInterface dialog) {
  344. }
  345. }
  346. }