blob: e77b58df7eb9cc22b6b9189b13856a97292701ec [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tv.settings.accessibility;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
import androidx.annotation.Keep;
import androidx.leanback.preference.LeanbackSettingsFragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityManager;
import com.android.internal.logging.nano.MetricsProto;
import com.android.tv.settings.R;
import com.android.tv.settings.RadioPreference;
import com.android.tv.settings.SettingsPreferenceFragment;
import java.util.List;
/**
* Fragment imitating a single-selection list for picking the accessibility shortcut service
*/
@Keep
public class AccessibilityShortcutServiceFragment extends SettingsPreferenceFragment implements
AccessibilityServiceConfirmationFragment.OnAccessibilityServiceConfirmedListener {
private static final String SERVICE_RADIO_GROUP = "service_group";
private final Preference.OnPreferenceChangeListener mPreferenceChangeListener =
(preference, newValue) -> {
final String newCompString = preference.getKey();
final String currentService =
AccessibilityShortcutFragment.getCurrentService(getContext());
if ((Boolean) newValue && !TextUtils.equals(newCompString, currentService)) {
final ComponentName cn = ComponentName.unflattenFromString(newCompString);
final CharSequence label = preference.getTitle();
final Fragment confirmFragment =
AccessibilityServiceConfirmationFragment.newInstance(cn, label, true);
confirmFragment.setTargetFragment(AccessibilityShortcutServiceFragment.this, 0);
final Fragment settingsFragment = getCallbackFragment();
if (settingsFragment instanceof LeanbackSettingsFragment) {
((LeanbackSettingsFragment) settingsFragment)
.startImmersiveFragment(confirmFragment);
} else {
throw new IllegalStateException("Not attached to settings fragment??");
}
}
return false;
};
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.accessibility_shortcut_service, null);
final PreferenceScreen screen = getPreferenceScreen();
final Context themedContext = getPreferenceManager().getContext();
final List<AccessibilityServiceInfo> installedServices = getContext()
.getSystemService(AccessibilityManager.class)
.getInstalledAccessibilityServiceList();
final PackageManager packageManager = getContext().getPackageManager();
final String currentService = AccessibilityShortcutFragment.getCurrentService(getContext());
for (AccessibilityServiceInfo service : installedServices) {
final RadioPreference preference = new RadioPreference(themedContext);
preference.setPersistent(false);
preference.setRadioGroup(SERVICE_RADIO_GROUP);
preference.setOnPreferenceChangeListener(mPreferenceChangeListener);
final String serviceString = service.getComponentName().flattenToString();
if (TextUtils.equals(currentService, serviceString)) {
preference.setChecked(true);
}
preference.setKey(serviceString);
preference.setTitle(service.getResolveInfo().loadLabel(packageManager));
screen.addPreference(preference);
}
}
@Override
public void onAccessibilityServiceConfirmed(ComponentName componentName, boolean enabling) {
final String componentString = componentName.flattenToString();
Settings.Secure.putString(getContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
componentString);
getFragmentManager().popBackStack();
}
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.ACCESSIBILITY_SERVICE;
}
}