private void handleToggleEnableAccessibilityGesturePreferenceClick() {
   Bundle extras = mGlobalGesturePreferenceScreen.getExtras();
   extras.putString(
       EXTRA_TITLE, getString(R.string.accessibility_global_gesture_preference_title));
   extras.putString(
       EXTRA_SUMMARY, getString(R.string.accessibility_global_gesture_preference_description));
   extras.putBoolean(
       EXTRA_CHECKED,
       Settings.Global.getInt(
               getContentResolver(),
               Settings.Global.ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED,
               0)
           == 1);
   super.onPreferenceTreeClick(mGlobalGesturePreferenceScreen, mGlobalGesturePreferenceScreen);
 }
 private void handleDisplayMagnificationPreferenceScreenClick() {
   Bundle extras = mDisplayMagnificationPreferenceScreen.getExtras();
   extras.putString(EXTRA_TITLE, getString(R.string.accessibility_screen_magnification_title));
   extras.putCharSequence(
       EXTRA_SUMMARY,
       getActivity().getResources().getText(R.string.accessibility_screen_magnification_summary));
   extras.putBoolean(
       EXTRA_CHECKED,
       Settings.Secure.getInt(
               getContentResolver(),
               Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
               0)
           == 1);
   super.onPreferenceTreeClick(
       mDisplayMagnificationPreferenceScreen, mDisplayMagnificationPreferenceScreen);
 }
  private void updateServicesPreferences() {
    // Since services category is auto generated we have to do a pass
    // to generate it since services can come and go and then based on
    // the global accessibility state to decided whether it is enabled.

    // Generate.
    mServicesCategory.removeAll();

    AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(getActivity());

    List<AccessibilityServiceInfo> installedServices =
        accessibilityManager.getInstalledAccessibilityServiceList();
    Set<ComponentName> enabledServices = getEnabledServicesFromSettings(getActivity());

    final boolean accessibilityEnabled =
        Settings.Secure.getInt(getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;

    for (int i = 0, count = installedServices.size(); i < count; ++i) {
      AccessibilityServiceInfo info = installedServices.get(i);

      PreferenceScreen preference = getPreferenceManager().createPreferenceScreen(getActivity());
      String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();

      ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
      ComponentName componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);

      preference.setKey(componentName.flattenToString());

      preference.setTitle(title);
      final boolean serviceEnabled =
          accessibilityEnabled && enabledServices.contains(componentName);
      if (serviceEnabled) {
        preference.setSummary(getString(R.string.accessibility_service_state_on));
      } else {
        preference.setSummary(getString(R.string.accessibility_service_state_off));
      }

      preference.setOrder(i);
      preference.setFragment(ToggleAccessibilityServiceFragment.class.getName());
      preference.setPersistent(true);

      Bundle extras = preference.getExtras();
      extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
      extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
      extras.putString(EXTRA_TITLE, title);

      String description = info.getDescription();
      if (TextUtils.isEmpty(description)) {
        description = getString(R.string.accessibility_service_default_description);
      }
      extras.putString(EXTRA_SUMMARY, description);

      CharSequence applicationLabel = info.getResolveInfo().loadLabel(getPackageManager());

      extras.putString(
          EXTRA_ENABLE_WARNING_TITLE,
          getString(R.string.accessibility_service_security_warning_title, applicationLabel));
      extras.putString(
          EXTRA_ENABLE_WARNING_MESSAGE,
          getString(R.string.accessibility_service_security_warning_summary, applicationLabel));

      extras.putString(
          EXTRA_DISABLE_WARNING_TITLE,
          getString(R.string.accessibility_service_disable_warning_title, applicationLabel));
      extras.putString(
          EXTRA_DISABLE_WARNING_MESSAGE,
          getString(R.string.accessibility_service_disable_warning_summary, applicationLabel));

      String settingsClassName = info.getSettingsActivityName();
      if (!TextUtils.isEmpty(settingsClassName)) {
        extras.putString(
            EXTRA_SETTINGS_TITLE, getString(R.string.accessibility_menu_item_settings));
        extras.putString(
            EXTRA_SETTINGS_COMPONENT_NAME,
            new ComponentName(info.getResolveInfo().serviceInfo.packageName, settingsClassName)
                .flattenToString());
      }

      mServicesCategory.addPreference(preference);
    }

    if (mServicesCategory.getPreferenceCount() == 0) {
      if (mNoServicesMessagePreference == null) {
        mNoServicesMessagePreference =
            new Preference(getActivity()) {
              @Override
              protected void onBindView(View view) {
                super.onBindView(view);

                LinearLayout containerView =
                    (LinearLayout) view.findViewById(R.id.message_container);
                containerView.setGravity(Gravity.CENTER);

                TextView summaryView = (TextView) view.findViewById(R.id.summary);
                String title = getString(R.string.accessibility_no_services_installed);
                summaryView.setText(title);
              }
            };
        mNoServicesMessagePreference.setPersistent(false);
        mNoServicesMessagePreference.setLayoutResource(R.layout.text_description_preference);
        mNoServicesMessagePreference.setSelectable(false);
      }
      mServicesCategory.addPreference(mNoServicesMessagePreference);
    }
  }
  @Override
  public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    if (preference == mVibrateWhenRinging) {
      Settings.System.putInt(
          getContentResolver(),
          Settings.System.VIBRATE_WHEN_RINGING,
          mVibrateWhenRinging.isChecked() ? 1 : 0);
    } else if (preference == mDtmfTone) {
      Settings.System.putInt(
          getContentResolver(),
          Settings.System.DTMF_TONE_WHEN_DIALING,
          mDtmfTone.isChecked() ? 1 : 0);

    } else if (preference == mSoundEffects) {
      if (mSoundEffects.isChecked()) {
        mAudioManager.loadSoundEffects();
      } else {
        mAudioManager.unloadSoundEffects();
      }
      Settings.System.putInt(
          getContentResolver(),
          Settings.System.SOUND_EFFECTS_ENABLED,
          mSoundEffects.isChecked() ? 1 : 0);

    } else if (preference == mHapticFeedback) {
      Settings.System.putInt(
          getContentResolver(),
          Settings.System.HAPTIC_FEEDBACK_ENABLED,
          mHapticFeedback.isChecked() ? 1 : 0);

    } else if (preference == mLockSounds) {
      Settings.System.putInt(
          getContentResolver(),
          Settings.System.LOCKSCREEN_SOUNDS_ENABLED,
          mLockSounds.isChecked() ? 1 : 0);

    } else if (preference == mMusicFx) {
      // let the framework fire off the intent
      return false;
    } else if (preference == mDockAudioSettings) {
      int dockState =
          mDockIntent != null
              ? mDockIntent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0)
              : Intent.EXTRA_DOCK_STATE_UNDOCKED;

      if (dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) {
        showDialog(DIALOG_NOT_DOCKED);
      } else {
        boolean isBluetooth = mDockIntent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) != null;

        if (isBluetooth) {
          Intent i = new Intent(mDockIntent);
          i.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
          i.setClass(getActivity(), DockEventReceiver.class);
          getActivity().sendBroadcast(i);
        } else {
          PreferenceScreen ps = (PreferenceScreen) mDockAudioSettings;
          Bundle extras = ps.getExtras();
          extras.putBoolean(
              "checked",
              Settings.Global.getInt(
                      getContentResolver(), Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0)
                  == 1);
          super.onPreferenceTreeClick(ps, ps);
        }
      }
    } else if (preference == mDockSounds) {
      Settings.Global.putInt(
          getContentResolver(),
          Settings.Global.DOCK_SOUNDS_ENABLED,
          mDockSounds.isChecked() ? 1 : 0);
    } else if (preference == mDockAudioMediaEnabled) {
      Settings.Global.putInt(
          getContentResolver(),
          Settings.Global.DOCK_AUDIO_MEDIA_ENABLED,
          mDockAudioMediaEnabled.isChecked() ? 1 : 0);
    }
    return true;
  }
  private void updateServicesPreferences() {
    // Since services category is auto generated we have to do a pass
    // to generate it since services can come and go and then based on
    // the global accessibility state to decided whether it is enabled.

    // Generate.
    mServicesCategory.removeAll();

    AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(getActivity());

    List<AccessibilityServiceInfo> installedServices =
        accessibilityManager.getInstalledAccessibilityServiceList();
    Set<ComponentName> enabledServices =
        AccessibilityUtils.getEnabledServicesFromSettings(getActivity());
    List<String> permittedServices = mDpm.getPermittedAccessibilityServices(UserHandle.myUserId());
    final boolean accessibilityEnabled =
        Settings.Secure.getInt(getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;

    for (int i = 0, count = installedServices.size(); i < count; ++i) {
      AccessibilityServiceInfo info = installedServices.get(i);

      PreferenceScreen preference = getPreferenceManager().createPreferenceScreen(getActivity());
      String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();

      ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
      ComponentName componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);

      preference.setKey(componentName.flattenToString());

      preference.setTitle(title);
      final boolean serviceEnabled =
          accessibilityEnabled && enabledServices.contains(componentName);
      String serviceEnabledString;
      if (serviceEnabled) {
        serviceEnabledString = getString(R.string.accessibility_feature_state_on);
      } else {
        serviceEnabledString = getString(R.string.accessibility_feature_state_off);
      }

      // Disable all accessibility services that are not permitted.
      String packageName = serviceInfo.packageName;
      boolean serviceAllowed = permittedServices == null || permittedServices.contains(packageName);
      preference.setEnabled(serviceAllowed || serviceEnabled);

      String summaryString;
      if (serviceAllowed) {
        summaryString = serviceEnabledString;
      } else {
        summaryString = getString(R.string.accessibility_feature_or_input_method_not_allowed);
      }
      preference.setSummary(summaryString);

      preference.setOrder(i);
      preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
      preference.setPersistent(true);

      Bundle extras = preference.getExtras();
      extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
      extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
      extras.putString(EXTRA_TITLE, title);

      String description = info.loadDescription(getPackageManager());
      if (TextUtils.isEmpty(description)) {
        description = getString(R.string.accessibility_service_default_description);
      }
      extras.putString(EXTRA_SUMMARY, description);

      String settingsClassName = info.getSettingsActivityName();
      if (!TextUtils.isEmpty(settingsClassName)) {
        extras.putString(
            EXTRA_SETTINGS_TITLE, getString(R.string.accessibility_menu_item_settings));
        extras.putString(
            EXTRA_SETTINGS_COMPONENT_NAME,
            new ComponentName(info.getResolveInfo().serviceInfo.packageName, settingsClassName)
                .flattenToString());
      }

      extras.putParcelable(EXTRA_COMPONENT_NAME, componentName);

      mServicesCategory.addPreference(preference);
    }

    if (mServicesCategory.getPreferenceCount() == 0) {
      if (mNoServicesMessagePreference == null) {
        mNoServicesMessagePreference = new Preference(getActivity());
        mNoServicesMessagePreference.setPersistent(false);
        mNoServicesMessagePreference.setLayoutResource(R.layout.text_description_preference);
        mNoServicesMessagePreference.setSelectable(false);
        mNoServicesMessagePreference.setSummary(
            getString(R.string.accessibility_no_services_installed));
      }
      mServicesCategory.addPreference(mNoServicesMessagePreference);
    }
  }
  @Override
  public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    if (preference == mSoundEffects) {
      if (mSoundEffects.isChecked()) {
        mAudioManager.loadSoundEffects();
      } else {
        mAudioManager.unloadSoundEffects();
      }

    } else if (preference == mMusicFx) {
      // let the framework fire off the intent
      return false;
    } else if (preference == mDockAudioSettings) {
      int dockState =
          mDockIntent != null
              ? mDockIntent.getIntExtra(Intent.EXTRA_DOCK_STATE, 0)
              : Intent.EXTRA_DOCK_STATE_UNDOCKED;

      if (dockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) {
        showDialog(DIALOG_NOT_DOCKED);
      } else {
        boolean isBluetooth = mDockIntent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) != null;

        if (isBluetooth) {
          Intent i = new Intent(mDockIntent);
          i.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
          i.setClass(getActivity(), DockEventReceiver.class);
          getActivity().sendBroadcast(i);
        } else {
          PreferenceScreen ps = (PreferenceScreen) mDockAudioSettings;
          Bundle extras = ps.getExtras();
          extras.putBoolean(
              "checked",
              Settings.Global.getInt(
                      getContentResolver(), Settings.Global.DOCK_AUDIO_MEDIA_ENABLED, 0)
                  == 1);
          super.onPreferenceTreeClick(ps, ps);
        }
      }
    } else if (preference == mDockSounds) {
      Settings.Global.putInt(
          getContentResolver(),
          Settings.Global.DOCK_SOUNDS_ENABLED,
          mDockSounds.isChecked() ? 1 : 0);
    } else if (preference == mDockAudioMediaEnabled) {
      Settings.Global.putInt(
          getContentResolver(),
          Settings.Global.DOCK_AUDIO_MEDIA_ENABLED,
          mDockAudioMediaEnabled.isChecked() ? 1 : 0);
    } else if (preference == mPowerSounds) {
      Settings.Global.putInt(
          getContentResolver(),
          Settings.Global.POWER_NOTIFICATIONS_ENABLED,
          mPowerSounds.isChecked() ? 1 : 0);

    } else if (preference == mPowerSoundsVibrate) {
      Settings.Global.putInt(
          getContentResolver(),
          Settings.Global.POWER_NOTIFICATIONS_VIBRATE,
          mPowerSoundsVibrate.isChecked() ? 1 : 0);

    } else if (preference == mPowerSoundsRingtone) {
      launchNotificationSoundPicker(
          REQUEST_CODE_POWER_NOTIFICATIONS_RINGTONE,
          Settings.Global.getString(
              getContentResolver(), Settings.Global.POWER_NOTIFICATIONS_RINGTONE));
    } else {
      // If we didn't handle it, let preferences handle it.
      return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

    return true;
  }