Esempio n. 1
0
  /** Method is beeing called on any click of an preference... */
  public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
    if (preference.getKey().equals(KEY_WIFI_BASED_SCREEN)) {
      mWifiList = mWifiManager.getConfiguredNetworks();
      if (mWifiList == null) {
        return false;
      }

      for (WifiConfiguration wifi : mWifiList) {
        // Friendly SSID-Name
        String ssid = wifi.SSID.replaceAll("\"", "");
        // Add PreferenceScreen for each network
        PreferenceScreen pref = getPreferenceManager().createPreferenceScreen(this);
        pref.setPersistent(false);
        pref.setKey("wifiNetwork" + ssid);
        pref.setTitle(ssid);

        Intent intent = new Intent(this, ConnectionSettings.class);
        intent.putExtra("SSID", ssid);
        pref.setIntent(intent);
        if (WifiConfiguration.Status.CURRENT == wifi.status) pref.setSummary(R.string.connected);
        else pref.setSummary(R.string.notInRange);
        mWifibasedCategory.addPreference(pref);
      }
    }

    return false;
  }
  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);
    }
  }
  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 void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    addPreferencesFromResource(R.xml.language_settings);

    try {
      mDefaultInputMethodSelectorVisibility =
          Integer.valueOf(getString(R.string.input_method_selector_visibility_default_value));
    } catch (NumberFormatException e) {
    }

    if (getActivity().getAssets().getLocales().length == 1) {
      // No "Select language" pref if there's only one system locale available.
      getPreferenceScreen().removePreference(findPreference(KEY_PHONE_LANGUAGE));
    } else {
      mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
    }
    if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
      mShowInputMethodSelectorPref = (ListPreference) findPreference(KEY_INPUT_METHOD_SELECTOR);
      mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
      // TODO: Update current input method name on summary
      updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility());
    }

    new VoiceInputOutputSettings(this).onCreate();

    // Get references to dynamically constructed categories.
    mHardKeyboardCategory = (PreferenceCategory) findPreference("hard_keyboard");
    mKeyboardSettingsCategory = (PreferenceCategory) findPreference("keyboard_settings_category");
    mGameControllerCategory =
        (PreferenceCategory) findPreference("game_controller_settings_category");

    // Filter out irrelevant features if invoked from IME settings button.
    mIsOnlyImeSettings =
        Settings.ACTION_INPUT_METHOD_SETTINGS.equals(getActivity().getIntent().getAction());
    getActivity().getIntent().setAction(null);
    if (mIsOnlyImeSettings) {
      getPreferenceScreen().removeAll();
      getPreferenceScreen().addPreference(mHardKeyboardCategory);
      if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
        getPreferenceScreen().addPreference(mShowInputMethodSelectorPref);
      }
      getPreferenceScreen().addPreference(mKeyboardSettingsCategory);
    }

    // Build IME preference category.
    mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    mImis = mImm.getInputMethodList();

    mKeyboardSettingsCategory.removeAll();
    if (!mIsOnlyImeSettings) {
      final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null);
      currentIme.setKey(KEY_CURRENT_INPUT_METHOD);
      currentIme.setTitle(getResources().getString(R.string.current_input_method));
      mKeyboardSettingsCategory.addPreference(currentIme);
    }

    mInputMethodPreferenceList.clear();
    final int N = (mImis == null ? 0 : mImis.size());
    for (int i = 0; i < N; ++i) {
      final InputMethodInfo imi = mImis.get(i);
      final InputMethodPreference pref = getInputMethodPreference(imi, N);
      mInputMethodPreferenceList.add(pref);
    }

    if (!mInputMethodPreferenceList.isEmpty()) {
      Collections.sort(mInputMethodPreferenceList);
      for (int i = 0; i < N; ++i) {
        mKeyboardSettingsCategory.addPreference(mInputMethodPreferenceList.get(i));
      }
    }

    // Build hard keyboard and game controller preference categories.
    mIm = (InputManager) getActivity().getSystemService(Context.INPUT_SERVICE);
    updateInputDevices();

    // Enable or disable mStatusBarImeSwitcher based on boolean value: config_show_cmIMESwitcher
    final Preference keyImeSwitcherPref = findPreference(KEY_IME_SWITCHER);
    if (keyImeSwitcherPref != null) {
      if (!getResources().getBoolean(com.android.internal.R.bool.config_show_cmIMESwitcher)) {
        getPreferenceScreen().removePreference(keyImeSwitcherPref);
      } else {
        mStatusBarImeSwitcher = (CheckBoxPreference) keyImeSwitcherPref;
      }
    }

    // Spell Checker
    final Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setClass(getActivity(), SpellCheckersSettingsActivity.class);
    final SpellCheckersPreference scp =
        ((SpellCheckersPreference) findPreference("spellcheckers_settings"));
    if (scp != null) {
      scp.setFragmentIntent(this, intent);
    }

    mVolumeKeyCursorControl = (ListPreference) findPreference(VOLUME_KEY_CURSOR_CONTROL);
    if (mVolumeKeyCursorControl != null) {
      mVolumeKeyCursorControl.setOnPreferenceChangeListener(this);
      mVolumeKeyCursorControl.setValue(
          Integer.toString(
              Settings.System.getInt(
                  getActivity().getContentResolver(),
                  Settings.System.VOLUME_KEY_CURSOR_CONTROL,
                  0)));
      mVolumeKeyCursorControl.setSummary(mVolumeKeyCursorControl.getEntry());
    }

    mHandler = new Handler();
    mSettingsObserver = new SettingsObserver(mHandler, getActivity());
  }