Refine metrics log in infrastructure
- Add interfaces to set/get metrics category in BasePreferenceController for descendants having a chance to get it. - Set metrics category in DashboardFragment - Automatically log metrics in onPreferenceChange of TogglePreferenceController - Add support for TwoStateButtonPreference in TogglePreferenceController to make the preference generic Bug: 137559984 Test: robotest Change-Id: Ia7e0d24a3db1991b18e0286d9894570fa71247a3
This commit is contained in:
@@ -17,7 +17,6 @@
|
|||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.app.settings.SettingsEnums;
|
|
||||||
import android.app.usage.UsageStats;
|
import android.app.usage.UsageStats;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.icu.text.RelativeDateTimeFormatter;
|
import android.icu.text.RelativeDateTimeFormatter;
|
||||||
@@ -98,12 +97,12 @@ public class RecentAppsPreferenceController extends BasePreferenceController
|
|||||||
.setHeaderTitleRes(R.string.recent_app_category_title)
|
.setHeaderTitleRes(R.string.recent_app_category_title)
|
||||||
.setHeaderDetailsClickListener((View v) -> {
|
.setHeaderDetailsClickListener((View v) -> {
|
||||||
mMetricsFeatureProvider.logClickedPreference(mRecentAppsPreference,
|
mMetricsFeatureProvider.logClickedPreference(mRecentAppsPreference,
|
||||||
SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY);
|
getMetricsCategory());
|
||||||
new SubSettingLauncher(mContext)
|
new SubSettingLauncher(mContext)
|
||||||
.setDestination(ManageApplications.class.getName())
|
.setDestination(ManageApplications.class.getName())
|
||||||
.setArguments(null /* arguments */)
|
.setArguments(null /* arguments */)
|
||||||
.setTitleRes(R.string.application_info_label)
|
.setTitleRes(R.string.application_info_label)
|
||||||
.setSourceMetricsCategory(SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY)
|
.setSourceMetricsCategory(getMetricsCategory())
|
||||||
.launch();
|
.launch();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -166,11 +165,10 @@ public class RecentAppsPreferenceController extends BasePreferenceController
|
|||||||
RelativeDateTimeFormatter.Style.SHORT))
|
RelativeDateTimeFormatter.Style.SHORT))
|
||||||
.setOnClickListener(v -> {
|
.setOnClickListener(v -> {
|
||||||
mMetricsFeatureProvider.logClickedPreference(mRecentAppsPreference,
|
mMetricsFeatureProvider.logClickedPreference(mRecentAppsPreference,
|
||||||
SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY);
|
getMetricsCategory());
|
||||||
AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
|
AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
|
||||||
R.string.application_info_label, pkgName, appEntry.info.uid,
|
R.string.application_info_label, pkgName, appEntry.info.uid,
|
||||||
mHost, 1001 /*RequestCode*/,
|
mHost, 1001 /*RequestCode*/, getMetricsCategory());
|
||||||
SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY);
|
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
@@ -46,7 +46,6 @@ import androidx.preference.PreferenceScreen;
|
|||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import com.android.settings.core.BasePreferenceController;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
@@ -202,8 +201,7 @@ public class DeviceAdminListPreferenceController extends BasePreferenceControlle
|
|||||||
pref.setSummary(item.getDescription());
|
pref.setSummary(item.getDescription());
|
||||||
pref.setEnabled(item.isEnabled());
|
pref.setEnabled(item.isEnabled());
|
||||||
pref.setOnPreferenceClickListener(preference -> {
|
pref.setOnPreferenceClickListener(preference -> {
|
||||||
mMetricsFeatureProvider.logClickedPreference(preference,
|
mMetricsFeatureProvider.logClickedPreference(preference, getMetricsCategory());
|
||||||
preference.getExtras().getInt(DashboardFragment.CATEGORY));
|
|
||||||
final UserHandle user = item.getUser();
|
final UserHandle user = item.getUser();
|
||||||
mContext.startActivityAsUser(item.getLaunchIntent(mContext), user);
|
mContext.startActivityAsUser(item.getLaunchIntent(mContext), user);
|
||||||
return true;
|
return true;
|
||||||
|
@@ -124,6 +124,7 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl
|
|||||||
private boolean mIsForWork;
|
private boolean mIsForWork;
|
||||||
@Nullable
|
@Nullable
|
||||||
private UserHandle mWorkProfileUser;
|
private UserHandle mWorkProfileUser;
|
||||||
|
private int mMetricsCategory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiate a controller as specified controller type and user-defined key.
|
* Instantiate a controller as specified controller type and user-defined key.
|
||||||
@@ -398,11 +399,27 @@ public abstract class BasePreferenceController extends AbstractPreferenceControl
|
|||||||
* This won't block UI thread however has similar side effect. Please use it if you
|
* This won't block UI thread however has similar side effect. Please use it if you
|
||||||
* want to avoid janky animation(i.e. new preference is added in the middle of page).
|
* want to avoid janky animation(i.e. new preference is added in the middle of page).
|
||||||
*
|
*
|
||||||
* This music be used in {@link BasePreferenceController}
|
* This must be used in {@link BasePreferenceController}
|
||||||
*/
|
*/
|
||||||
public interface UiBlocker {
|
public interface UiBlocker {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the metrics category of the parent fragment.
|
||||||
|
*
|
||||||
|
* Called by DashboardFragment#onAttach
|
||||||
|
*/
|
||||||
|
public void setMetricsCategory(int metricsCategory) {
|
||||||
|
mMetricsCategory = metricsCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the metrics category of the parent fragment.
|
||||||
|
*/
|
||||||
|
protected int getMetricsCategory() {
|
||||||
|
return mMetricsCategory;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Non-{@code null} {@link UserHandle} when a work profile is enabled.
|
* @return Non-{@code null} {@link UserHandle} when a work profile is enabled.
|
||||||
* Otherwise {@code null}.
|
* Otherwise {@code null}.
|
||||||
|
@@ -18,8 +18,10 @@ import android.content.Context;
|
|||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.TwoStatePreference;
|
import androidx.preference.TwoStatePreference;
|
||||||
|
|
||||||
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.slices.SliceData;
|
import com.android.settings.slices.SliceData;
|
||||||
import com.android.settings.widget.MasterSwitchPreference;
|
import com.android.settings.widget.MasterSwitchPreference;
|
||||||
|
import com.android.settings.widget.TwoStateButtonPreference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract class that consolidates logic for updating toggle controllers.
|
* Abstract class that consolidates logic for updating toggle controllers.
|
||||||
@@ -54,6 +56,8 @@ public abstract class TogglePreferenceController extends BasePreferenceControlle
|
|||||||
((TwoStatePreference) preference).setChecked(isChecked());
|
((TwoStatePreference) preference).setChecked(isChecked());
|
||||||
} else if (preference instanceof MasterSwitchPreference) {
|
} else if (preference instanceof MasterSwitchPreference) {
|
||||||
((MasterSwitchPreference) preference).setChecked(isChecked());
|
((MasterSwitchPreference) preference).setChecked(isChecked());
|
||||||
|
} else if (preference instanceof TwoStateButtonPreference) {
|
||||||
|
((TwoStateButtonPreference) preference).setChecked(isChecked());
|
||||||
} else {
|
} else {
|
||||||
refreshSummary(preference);
|
refreshSummary(preference);
|
||||||
}
|
}
|
||||||
@@ -61,6 +65,12 @@ public abstract class TogglePreferenceController extends BasePreferenceControlle
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean onPreferenceChange(Preference preference, Object newValue) {
|
public final boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
|
// TwoStatePreference is a regular preference and can be handled by DashboardFragment
|
||||||
|
if (preference instanceof MasterSwitchPreference
|
||||||
|
|| preference instanceof TwoStateButtonPreference) {
|
||||||
|
FeatureFactory.getFactory(mContext).getMetricsFeatureProvider()
|
||||||
|
.logClickedPreference(preference, getMetricsCategory());
|
||||||
|
}
|
||||||
return setChecked((boolean) newValue);
|
return setChecked((boolean) newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -113,6 +113,14 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Set metrics category for BasePreferenceController.
|
||||||
|
final int metricCategory = getMetricsCategory();
|
||||||
|
mControllers.forEach(controller -> {
|
||||||
|
if (controller instanceof BasePreferenceController) {
|
||||||
|
((BasePreferenceController) controller).setMetricsCategory(metricCategory);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
mPlaceholderPreferenceController =
|
mPlaceholderPreferenceController =
|
||||||
new DashboardTilePlaceholderPreferenceController(context);
|
new DashboardTilePlaceholderPreferenceController(context);
|
||||||
mControllers.add(mPlaceholderPreferenceController);
|
mControllers.add(mPlaceholderPreferenceController);
|
||||||
|
@@ -17,7 +17,6 @@
|
|||||||
package com.android.settings.display;
|
package com.android.settings.display;
|
||||||
|
|
||||||
import android.app.UiModeManager;
|
import android.app.UiModeManager;
|
||||||
import android.app.settings.SettingsEnums;
|
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -33,8 +32,6 @@ import androidx.preference.PreferenceScreen;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.core.TogglePreferenceController;
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||||
@@ -49,7 +46,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
Preference mPreference;
|
Preference mPreference;
|
||||||
|
|
||||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
|
||||||
private UiModeManager mUiModeManager;
|
private UiModeManager mUiModeManager;
|
||||||
private PowerManager mPowerManager;
|
private PowerManager mPowerManager;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -68,7 +64,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple
|
|||||||
mContext = context;
|
mContext = context;
|
||||||
mUiModeManager = context.getSystemService(UiModeManager.class);
|
mUiModeManager = context.getSystemService(UiModeManager.class);
|
||||||
mPowerManager = context.getSystemService(PowerManager.class);
|
mPowerManager = context.getSystemService(PowerManager.class);
|
||||||
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -91,7 +86,6 @@ public class DarkUIPreferenceController extends TogglePreferenceController imple
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean setChecked(boolean isChecked) {
|
public boolean setChecked(boolean isChecked) {
|
||||||
mMetricsFeatureProvider.logClickedPreference(mPreference, SettingsEnums.DISPLAY);
|
|
||||||
final boolean dialogSeen =
|
final boolean dialogSeen =
|
||||||
Settings.Secure.getInt(mContext.getContentResolver(),
|
Settings.Secure.getInt(mContext.getContentResolver(),
|
||||||
Settings.Secure.DARK_MODE_DIALOG_SEEN, 0) == DIALOG_SEEN;
|
Settings.Secure.DARK_MODE_DIALOG_SEEN, 0) == DIALOG_SEEN;
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package com.android.settings.display;
|
package com.android.settings.display;
|
||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.hardware.display.ColorDisplayManager;
|
import android.hardware.display.ColorDisplayManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@@ -50,8 +49,7 @@ public class NightDisplayActivationPreferenceController extends TogglePreference
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
mButtonTriggered = true;
|
mButtonTriggered = true;
|
||||||
mMetricsFeatureProvider.logClickedPreference(mPreference,
|
mMetricsFeatureProvider.logClickedPreference(mPreference, getMetricsCategory());
|
||||||
SettingsEnums.NIGHT_DISPLAY_SETTINGS);
|
|
||||||
mColorDisplayManager.setNightDisplayActivated(
|
mColorDisplayManager.setNightDisplayActivated(
|
||||||
!mColorDisplayManager.isNightDisplayActivated());
|
!mColorDisplayManager.isNightDisplayActivated());
|
||||||
updateStateInternal();
|
updateStateInternal();
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
package com.android.settings.display.darkmode;
|
package com.android.settings.display.darkmode;
|
||||||
|
|
||||||
import android.app.UiModeManager;
|
import android.app.UiModeManager;
|
||||||
import android.app.settings.SettingsEnums;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
@@ -136,8 +135,7 @@ public class DarkModeActivationPreferenceController extends BasePreferenceContro
|
|||||||
private final View.OnClickListener mListener = new View.OnClickListener() {
|
private final View.OnClickListener mListener = new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
mMetricsFeatureProvider.logClickedPreference(mPreference,
|
mMetricsFeatureProvider.logClickedPreference(mPreference, getMetricsCategory());
|
||||||
SettingsEnums.DARK_UI_SETTINGS);
|
|
||||||
final boolean active = (mContext.getResources().getConfiguration().uiMode
|
final boolean active = (mContext.getResources().getConfiguration().uiMode
|
||||||
& Configuration.UI_MODE_NIGHT_YES) != 0;
|
& Configuration.UI_MODE_NIGHT_YES) != 0;
|
||||||
mUiModeManager.setNightModeActivated(!active);
|
mUiModeManager.setNightModeActivated(!active);
|
||||||
|
@@ -16,21 +16,17 @@
|
|||||||
|
|
||||||
package com.android.settings.fuelgauge.batterysaver;
|
package com.android.settings.fuelgauge.batterysaver;
|
||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.provider.SettingsSlicesContract;
|
import android.provider.SettingsSlicesContract;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
import com.android.settings.core.TogglePreferenceController;
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
import com.android.settings.fuelgauge.BatterySaverReceiver;
|
import com.android.settings.fuelgauge.BatterySaverReceiver;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
|
||||||
import com.android.settings.widget.TwoStateButtonPreference;
|
import com.android.settings.widget.TwoStateButtonPreference;
|
||||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
|
||||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStart;
|
import com.android.settingslib.core.lifecycle.events.OnStart;
|
||||||
import com.android.settingslib.core.lifecycle.events.OnStop;
|
import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||||
@@ -45,13 +41,11 @@ public class BatterySaverButtonPreferenceController extends
|
|||||||
|
|
||||||
private final BatterySaverReceiver mBatterySaverReceiver;
|
private final BatterySaverReceiver mBatterySaverReceiver;
|
||||||
private final PowerManager mPowerManager;
|
private final PowerManager mPowerManager;
|
||||||
private final MetricsFeatureProvider mMetricsFeatureProvider;
|
|
||||||
|
|
||||||
private TwoStateButtonPreference mPreference;
|
private TwoStateButtonPreference mPreference;
|
||||||
|
|
||||||
public BatterySaverButtonPreferenceController(Context context, String key) {
|
public BatterySaverButtonPreferenceController(Context context, String key) {
|
||||||
super(context, key);
|
super(context, key);
|
||||||
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
|
|
||||||
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||||
mBatterySaverReceiver = new BatterySaverReceiver(context);
|
mBatterySaverReceiver = new BatterySaverReceiver(context);
|
||||||
mBatterySaverReceiver.setBatterySaverListener(this);
|
mBatterySaverReceiver.setBatterySaverListener(this);
|
||||||
@@ -100,21 +94,11 @@ public class BatterySaverButtonPreferenceController extends
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean setChecked(boolean stateOn) {
|
public boolean setChecked(boolean stateOn) {
|
||||||
mMetricsFeatureProvider.logClickedPreference(mPreference,
|
|
||||||
SettingsEnums.FUELGAUGE_BATTERY_SAVER);
|
|
||||||
// This screen already shows a warning, so we don't need another warning.
|
// This screen already shows a warning, so we don't need another warning.
|
||||||
return BatterySaverUtils.setPowerSaveMode(mContext, stateOn,
|
return BatterySaverUtils.setPowerSaveMode(mContext, stateOn,
|
||||||
false /* needFirstTimeWarning */);
|
false /* needFirstTimeWarning */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateState(Preference preference) {
|
|
||||||
super.updateState(preference);
|
|
||||||
if (mPreference != null) {
|
|
||||||
mPreference.setChecked(isChecked());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPowerSaveModeChanged() {
|
public void onPowerSaveModeChanged() {
|
||||||
final boolean isChecked = isChecked();
|
final boolean isChecked = isChecked();
|
||||||
|
@@ -28,6 +28,7 @@ import static org.mockito.ArgumentMatchers.anyString;
|
|||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
@@ -205,6 +206,15 @@ public class BasePreferenceControllerTest {
|
|||||||
assertThat(keys).isEmpty();
|
assertThat(keys).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMetricsCategory_metricsCategoryIsSet_shouldReturnTheSameCategory() {
|
||||||
|
mPreferenceController.setMetricsCategory(SettingsEnums.DISPLAY);
|
||||||
|
|
||||||
|
final int category = mPreferenceController.getMetricsCategory();
|
||||||
|
|
||||||
|
assertThat(category).isEqualTo(SettingsEnums.DISPLAY);
|
||||||
|
}
|
||||||
|
|
||||||
private class FakeBasePreferenceController extends BasePreferenceController {
|
private class FakeBasePreferenceController extends BasePreferenceController {
|
||||||
|
|
||||||
private int mAvailable;
|
private int mAvailable;
|
||||||
|
Reference in New Issue
Block a user