diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java index 0ea9515ed16..d5d72bcd5a0 100644 --- a/src/com/android/settings/applications/AppStorageSettings.java +++ b/src/com/android/settings/applications/AppStorageSettings.java @@ -30,7 +30,6 @@ import android.content.pm.IPackageDataObserver; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.os.Bundle; -import android.os.Environment; import android.os.Handler; import android.os.Message; import android.os.RemoteException; @@ -39,7 +38,6 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; -import android.text.format.Formatter; import android.util.Log; import android.util.MutableInt; import android.view.View; @@ -51,8 +49,6 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.deviceinfo.StorageWizardMoveConfirm; import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.applications.ApplicationsState; -import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.ApplicationsState.Callbacks; import com.android.settingslib.applications.StorageStatsSource; import com.android.settingslib.applications.StorageStatsSource.AppStorageStats; @@ -196,6 +192,8 @@ public class AppStorageSettings extends AppInfoWithHeader } else if (mClearCacheObserver == null) { // Lazy initialization of observer mClearCacheObserver = new ClearCacheObserver(); } + mMetricsFeatureProvider.action(getContext(), + MetricsEvent.ACTION_SETTINGS_CLEAR_APP_CACHE); mPm.deleteApplicationCacheFiles(mPackageName, mClearCacheObserver); } else if (v == mClearDataButton) { if (mAppsControlDisallowedAdmin != null && !mAppsControlDisallowedBySystem) { @@ -344,6 +342,7 @@ public class AppStorageSettings extends AppInfoWithHeader * button for a system package */ private void initiateClearUserData() { + mMetricsFeatureProvider.action(getContext(), MetricsEvent.ACTION_SETTINGS_CLEAR_APP_DATA); mClearDataButton.setEnabled(false); // Invoke uninstall or clear user data based on sysPackage String packageName = mAppEntry.info.packageName; diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index da6bbc0ff42..08be7f7dd86 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -157,8 +157,6 @@ public class InstalledAppDetails extends AppInfoBase private static final String KEY_MEMORY = "memory"; private static final String KEY_VERSION = "app_version"; - private static final String NOTIFICATION_TUNER_SETTING = "show_importance_slider"; - private final HashSet mHomePackages = new HashSet<>(); private boolean mInitialized; @@ -735,6 +733,8 @@ public class InstalledAppDetails extends AppInfoBase new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Disable the app + mMetricsFeatureProvider.action(getContext(), + MetricsEvent.ACTION_SETTINGS_DISABLE_APP); new DisableChanger(InstalledAppDetails.this, mAppEntry.info, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) .execute((Object)null); @@ -749,6 +749,8 @@ public class InstalledAppDetails extends AppInfoBase new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Disable the app and ask for uninstall + mMetricsFeatureProvider.action(getContext(), + MetricsEvent.ACTION_SETTINGS_DISABLE_APP); uninstallPkg(mAppEntry.info.packageName, false, true); } @@ -777,13 +779,14 @@ public class InstalledAppDetails extends AppInfoBase Uri packageURI = Uri.parse("package:"+packageName); Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); + mMetricsFeatureProvider.action( + getContext(), MetricsEvent.ACTION_SETTINGS_UNINSTALL_APP); startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); mDisableAfterUninstall = andDisable; } private void forceStopPackage(String pkgName) { - FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(), - MetricsEvent.ACTION_APP_FORCE_STOP, pkgName); + mMetricsFeatureProvider.action(getContext(), MetricsEvent.ACTION_APP_FORCE_STOP, pkgName); ActivityManager am = (ActivityManager) getActivity().getSystemService( Context.ACTIVITY_SERVICE); Log.d(LOG_TAG, "Stopping package " + pkgName); @@ -802,7 +805,7 @@ public class InstalledAppDetails extends AppInfoBase mForceStopButton.setEnabled(false); } else { mForceStopButton.setEnabled(enabled); - mForceStopButton.setOnClickListener(InstalledAppDetails.this); + mForceStopButton.setOnClickListener(this); } } @@ -875,6 +878,8 @@ public class InstalledAppDetails extends AppInfoBase Intent uninstallDAIntent = new Intent(activity, DeviceAdminAdd.class); uninstallDAIntent.putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME, mPackageName); + mMetricsFeatureProvider.action( + activity, MetricsEvent.ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN); activity.startActivityForResult(uninstallDAIntent, REQUEST_REMOVE_DEVICE_ADMIN); return; } @@ -895,6 +900,11 @@ public class InstalledAppDetails extends AppInfoBase showDialogInner(DLG_DISABLE, 0); } } else { + mMetricsFeatureProvider.action( + getActivity(), + mAppEntry.info.enabled + ? MetricsEvent.ACTION_SETTINGS_DISABLE_APP + : MetricsEvent.ACTION_SETTINGS_ENABLE_APP); new DisableChanger(this, mAppEntry.info, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) .execute((Object) null); diff --git a/src/com/android/settings/search2/InlineSwitchViewHolder.java b/src/com/android/settings/search2/InlineSwitchViewHolder.java index ac49b1c816c..d4a0ca24a2a 100644 --- a/src/com/android/settings/search2/InlineSwitchViewHolder.java +++ b/src/com/android/settings/search2/InlineSwitchViewHolder.java @@ -18,10 +18,11 @@ package com.android.settings.search2; import android.content.Context; +import android.util.Pair; import android.view.View; -import android.widget.CompoundButton; import android.widget.Switch; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; /** @@ -36,7 +37,7 @@ public class InlineSwitchViewHolder extends SearchViewHolder { public InlineSwitchViewHolder(View view, Context context) { super(view); mContext = context; - switchView = (Switch) view.findViewById(R.id.switchView); + switchView = view.findViewById(R.id.switchView); } @Override @@ -47,12 +48,21 @@ public class InlineSwitchViewHolder extends SearchViewHolder { } final InlineSwitchPayload payload = (InlineSwitchPayload) result.payload; switchView.setChecked(payload.getSwitchValue(mContext)); - switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - fragment.onSearchResultClicked(); - payload.setSwitchValue(mContext, isChecked); - } + switchView.setOnCheckedChangeListener((buttonView, isChecked) -> { + final Pair name = Pair.create( + MetricsEvent.FIELD_SETTINGS_SEARCH_INLINE_RESULT_NAME, payload.settingsUri); + final Pair value = Pair.create( + MetricsEvent.FIELD_SETTINGS_SEARCH_INLINE_RESULT_VALUE, isChecked + ? "checked" + : "not-checked"); + final Pair rank = Pair.create( + MetricsEvent.FIELD_SETTINGS_SERACH_RESULT_RANK, getAdapterPosition()); + mMetricsFeatureProvider.action(mContext, + MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_INLINE_RESULT, + name, value, rank); + + fragment.onSearchResultClicked(); + payload.setSwitchValue(mContext, isChecked); }); } } diff --git a/src/com/android/settings/search2/IntentSearchViewHolder.java b/src/com/android/settings/search2/IntentSearchViewHolder.java index 79e1cc86b09..f0cbc51391d 100644 --- a/src/com/android/settings/search2/IntentSearchViewHolder.java +++ b/src/com/android/settings/search2/IntentSearchViewHolder.java @@ -23,8 +23,6 @@ import android.view.View; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.SettingsActivity; -import com.android.settings.core.instrumentation.MetricsFeatureProvider; -import com.android.settings.overlay.FeatureFactory; /** * ViewHolder for intent based search results. @@ -32,12 +30,8 @@ import com.android.settings.overlay.FeatureFactory; */ public class IntentSearchViewHolder extends SearchViewHolder { - private final MetricsFeatureProvider mMetricsFeatureProvider; - public IntentSearchViewHolder(View view) { super(view); - mMetricsFeatureProvider = FeatureFactory.getFactory(view.getContext()) - .getMetricsFeatureProvider(); } @Override diff --git a/src/com/android/settings/search2/SearchViewHolder.java b/src/com/android/settings/search2/SearchViewHolder.java index e36939126db..123a602c5c4 100644 --- a/src/com/android/settings/search2/SearchViewHolder.java +++ b/src/com/android/settings/search2/SearchViewHolder.java @@ -17,8 +17,6 @@ package com.android.settings.search2; import android.content.Context; import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.os.UserHandle; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; @@ -26,6 +24,8 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.settings.R; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; +import com.android.settings.overlay.FeatureFactory; /** * The ViewHolder for the Search RecyclerView. @@ -39,12 +39,16 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { public final TextView breadcrumbView; public final ImageView iconView; + protected final MetricsFeatureProvider mMetricsFeatureProvider; + public SearchViewHolder(View view) { super(view); - titleView = (TextView) view.findViewById(android.R.id.title); - summaryView = (TextView) view.findViewById(android.R.id.summary); - iconView = (ImageView) view.findViewById(android.R.id.icon); - breadcrumbView = (TextView) view.findViewById(R.id.breadcrumb); + mMetricsFeatureProvider = FeatureFactory.getFactory(view.getContext()) + .getMetricsFeatureProvider(); + titleView = view.findViewById(android.R.id.title); + summaryView = view.findViewById(android.R.id.summary); + iconView = view.findViewById(android.R.id.icon); + breadcrumbView = view.findViewById(R.id.breadcrumb); } public void onBind(SearchFragment fragment, SearchResult result) { diff --git a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java index b8fe3fcfd4b..ba9feb34604 100644 --- a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java +++ b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java @@ -19,9 +19,10 @@ package com.android.settings.search; import android.content.Context; import android.graphics.drawable.Drawable; +import android.util.Pair; import android.view.LayoutInflater; -import android.view.View; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; @@ -29,19 +30,24 @@ import com.android.settings.search2.InlineSwitchPayload; import com.android.settings.search2.InlineSwitchViewHolder; import com.android.settings.search2.SearchFragment; import com.android.settings.search2.SearchResult; +import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowApplication; +import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) @@ -51,22 +57,31 @@ public class InlineSwitchViewHolderTest { private static final String TITLE = "title"; private static final String SUMMARY = "summary"; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; @Mock private SearchFragment mFragment; @Mock private InlineSwitchPayload mPayload; + + private FakeFeatureFactory mFeatureFactory; private InlineSwitchViewHolder mHolder; private Drawable mIcon; @Before public void setUp() { MockitoAnnotations.initMocks(this); - final Context context = ShadowApplication.getInstance().getApplicationContext(); - View view = LayoutInflater.from(context).inflate(R.layout.search_inline_switch_item, null); - mHolder = new InlineSwitchViewHolder(view, context); - + final Context context = RuntimeEnvironment.application; mIcon = context.getDrawable(R.drawable.ic_search_history); + FakeFeatureFactory.setupForTest(mContext); + mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); + + mHolder = new InlineSwitchViewHolder( + LayoutInflater.from(context).inflate(R.layout.search_inline_switch_item, null), + context); + ReflectionHelpers.setField(mHolder, "mMetricsFeatureProvider", + mFeatureFactory.metricsFeatureProvider); } @Test @@ -82,12 +97,19 @@ public class InlineSwitchViewHolderTest { when(mPayload.getSwitchValue(any(Context.class))).thenReturn(true); SearchResult result = getSearchResult(); mHolder.onBind(mFragment, result); - mHolder.switchView.setChecked(true); + // Precondition: switch is on. + assertThat(mHolder.switchView.isChecked()).isTrue(); + mHolder.switchView.performClick(); + + verify(mFeatureFactory.metricsFeatureProvider).action( + any(Context.class), + eq(MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_INLINE_RESULT), + any(Pair.class), any(Pair.class), any(Pair.class)); assertThat(mHolder.titleView.getText()).isEqualTo(TITLE); assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY); assertThat(mHolder.iconView.getDrawable()).isEqualTo(mIcon); - assertThat(mHolder.switchView.isChecked()).isTrue(); + assertThat(mHolder.switchView.isChecked()).isFalse(); } private SearchResult getSearchResult() {