diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java new file mode 100644 index 00000000000..a9d7c0551d1 --- /dev/null +++ b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2021 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.settings.accessibility; + +import android.content.ComponentName; + +import androidx.annotation.Nullable; + +/** + * Provider for Accessibility metrics related features. + */ +public interface AccessibilityMetricsFeatureProvider { + + /** + * Returns {@link android.app.settings.SettingsEnums} value according to the {@code + * componentName}. + * + * @param componentName the component name of the downloaded service or activity + * @return value in {@link android.app.settings.SettingsEnums} + */ + int getDownloadedFeatureMetricsCategory(@Nullable ComponentName componentName); +} diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java new file mode 100644 index 00000000000..0f85f38f571 --- /dev/null +++ b/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 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.settings.accessibility; + +import android.app.settings.SettingsEnums; +import android.content.ComponentName; + +/** + * Provider implementation for Accessibility metrics related features. + */ +public class AccessibilityMetricsFeatureProviderImpl implements + AccessibilityMetricsFeatureProvider { + + @Override + public int getDownloadedFeatureMetricsCategory(ComponentName componentName) { + return SettingsEnums.ACCESSIBILITY_SERVICE; + } +} diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index 98090ac1dba..3b15830a153 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -41,6 +41,7 @@ import androidx.annotation.Nullable; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.overlay.FeatureFactory; import java.util.ArrayList; import java.util.List; @@ -51,6 +52,19 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature private static final String EMPTY_STRING = ""; protected static final String KEY_LAUNCH_PREFERENCE = "launch_preference"; + @Override + public int getMetricsCategory() { + // Retrieve from getArguments() directly because this function will be executed from + // onAttach(), but variable mComponentName only available after onProcessArguments() + // which comes from onCreateView(). + final ComponentName componentName = getArguments().getParcelable( + AccessibilitySettings.EXTRA_COMPONENT_NAME); + + return FeatureFactory.getFactory(getActivity().getApplicationContext()) + .getAccessibilityMetricsFeatureProvider() + .getDownloadedFeatureMetricsCategory(componentName); + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -60,7 +74,7 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature initLaunchPreference(); removePreference(KEY_USE_SERVICE_PREFERENCE); return view; - }; + } @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { @@ -70,7 +84,6 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature @Override protected void onProcessArguments(Bundle arguments) { super.onProcessArguments(arguments); - mComponentName = arguments.getParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME); final ActivityInfo info = getAccessibilityShortcutInfo().getActivityInfo(); mPackageName = info.loadLabel(getPackageManager()).toString(); diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index 0e209aa77af..bd634065103 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -54,6 +54,7 @@ import androidx.annotation.Nullable; import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.accessibility.AccessibilityUtil.UserShortcutType; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settingslib.accessibility.AccessibilityUtils; @@ -84,7 +85,15 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public int getMetricsCategory() { - return SettingsEnums.ACCESSIBILITY_SERVICE; + // Retrieve from getArguments() directly because this function will be executed from + // onAttach(), but variable mComponentName only available after onProcessArguments() + // which comes from onCreateView(). + final ComponentName componentName = getArguments().getParcelable( + AccessibilitySettings.EXTRA_COMPONENT_NAME); + + return FeatureFactory.getFactory(getActivity().getApplicationContext()) + .getAccessibilityMetricsFeatureProvider() + .getDownloadedFeatureMetricsCategory(componentName); } @Override diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index cfdc9eb5b62..93af23193d4 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -23,6 +23,7 @@ import android.util.Log; import androidx.annotation.Nullable; import com.android.settings.R; +import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider; import com.android.settings.accessibility.AccessibilitySearchFeatureProvider; import com.android.settings.accounts.AccountFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider; @@ -111,13 +112,13 @@ public abstract class FeatureFactory { public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider(Context context); /** - * Retrieve implementation for Battery Status feature. + * Retrieves implementation for Battery Status feature. */ public abstract BatteryStatusFeatureProvider getBatteryStatusFeatureProvider( Context context); /** - * Get implementation for Battery Settings provider. + * Gets implementation for Battery Settings provider. */ public abstract BatterySettingsFeatureProvider getBatterySettingsFeatureProvider( Context context); @@ -161,25 +162,30 @@ public abstract class FeatureFactory { public abstract WifiTrackerLibProvider getWifiTrackerLibProvider(); /** - * Retrieve implementation for Extra App Info feature. + * Retrieves implementation for Extra App Info feature. */ public abstract ExtraAppInfoFeatureProvider getExtraAppInfoFeatureProvider(); /** - * Retrieve implementation for SecuritySettings feature. + * Retrieves implementation for SecuritySettings feature. */ public abstract SecuritySettingsFeatureProvider getSecuritySettingsFeatureProvider(); /** - * Retrieve implementation for Game Settings feature. + * Retrieves implementation for Game Settings feature. */ public abstract GameSettingsFeatureProvider getGameSettingsFeatureProvider(); /** - * Retrieve implementation for Accessibility search index feature. + * Retrieves implementation for Accessibility search index feature. */ public abstract AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider(); + /** + * Retrieves implementation for Accessibility metrics category feature. + */ + public abstract AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider(); + public static final class FactoryNotFoundException extends RuntimeException { public FactoryNotFoundException(Throwable throwable) { super("Unable to create factory. Did you misconfigure Proguard?", throwable); diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 9890a109641..2c63856d353 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -25,6 +25,8 @@ import android.os.UserManager; import androidx.annotation.Keep; +import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider; +import com.android.settings.accessibility.AccessibilityMetricsFeatureProviderImpl; import com.android.settings.accessibility.AccessibilitySearchFeatureProvider; import com.android.settings.accessibility.AccessibilitySearchFeatureProviderImpl; import com.android.settings.accounts.AccountFeatureProvider; @@ -109,6 +111,7 @@ public class FeatureFactoryImpl extends FeatureFactory { private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider; private GameSettingsFeatureProvider mGameSettingsFeatureProvider; private AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider; + private AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider; @Override public SupportFeatureProvider getSupportFeatureProvider(Context context) { @@ -346,4 +349,12 @@ public class FeatureFactoryImpl extends FeatureFactory { } return mAccessibilitySearchFeatureProvider; } + + @Override + public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() { + if (mAccessibilityMetricsFeatureProvider == null) { + mAccessibilityMetricsFeatureProvider = new AccessibilityMetricsFeatureProviderImpl(); + } + return mAccessibilityMetricsFeatureProvider; + } } diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java index de1af23c6ff..bc430e832e5 100644 --- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -21,6 +21,7 @@ import static org.mockito.Mockito.when; import android.content.Context; +import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider; import com.android.settings.accessibility.AccessibilitySearchFeatureProvider; import com.android.settings.accounts.AccountFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider; @@ -89,6 +90,7 @@ public class FakeFeatureFactory extends FeatureFactory { public SecuritySettingsFeatureProvider securitySettingsFeatureProvider; public GameSettingsFeatureProvider gameSettingsFeatureProvider; public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider; + public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider; /** * Call this in {@code @Before} method of the test class to use fake factory. @@ -139,6 +141,7 @@ public class FakeFeatureFactory extends FeatureFactory { securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class); gameSettingsFeatureProvider = mock(GameSettingsFeatureProvider.class); mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class); + mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class); } @Override @@ -280,4 +283,9 @@ public class FakeFeatureFactory extends FeatureFactory { public AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider() { return mAccessibilitySearchFeatureProvider; } + + @Override + public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() { + return mAccessibilityMetricsFeatureProvider; + } } diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java index a05436c809b..0b6061c7115 100644 --- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -19,6 +19,7 @@ import static org.mockito.Mockito.mock; import android.content.Context; +import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider; import com.android.settings.accessibility.AccessibilitySearchFeatureProvider; import com.android.settings.accounts.AccountFeatureProvider; import com.android.settings.applications.ApplicationFeatureProvider; @@ -84,6 +85,7 @@ public class FakeFeatureFactory extends FeatureFactory { public SecuritySettingsFeatureProvider securitySettingsFeatureProvider; public GameSettingsFeatureProvider gameSettingsFeatureProvider; public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider; + public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider; /** * Call this in {@code @Before} method of the test class to use fake factory. @@ -125,6 +127,7 @@ public class FakeFeatureFactory extends FeatureFactory { securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class); gameSettingsFeatureProvider = mock(GameSettingsFeatureProvider.class); mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class); + mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class); } @Override @@ -266,4 +269,9 @@ public class FakeFeatureFactory extends FeatureFactory { public AccessibilitySearchFeatureProvider getAccessibilitySearchFeatureProvider() { return mAccessibilitySearchFeatureProvider; } + + @Override + public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() { + return mAccessibilityMetricsFeatureProvider; + } }