Add action log in "Restrict app page".
This CL adds confirmation dialog in "Restrict app page". By go through BatteryTipDialogFragment, it will find the correct action, in which we already have log: 1. RestrictAppAction 2. UnRestrictAppAction Bug: 79992590 Test: RunSettingsRoboTests Change-Id: I179fbd17a012528fdfacf42e4a93943eaefff23d Merged-In: I179fbd17a012528fdfacf42e4a93943eaefff23d
This commit is contained in:
@@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
package com.android.settings.fuelgauge;
|
package com.android.settings.fuelgauge;
|
||||||
|
|
||||||
import android.app.AppOpsManager;
|
|
||||||
import android.app.Fragment;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@@ -31,12 +29,16 @@ import android.util.IconDrawableFactory;
|
|||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.logging.nano.MetricsProto;
|
import com.android.internal.logging.nano.MetricsProto;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.BatteryTipDialogFragment;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
|
||||||
import com.android.settings.widget.AppCheckBoxPreference;
|
import com.android.settings.widget.AppCheckBoxPreference;
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
import com.android.settingslib.core.AbstractPreferenceController;
|
||||||
import com.android.settingslib.widget.FooterPreferenceMixin;
|
import com.android.settingslib.widget.FooterPreferenceMixin;
|
||||||
@@ -46,7 +48,8 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* Fragment to show a list of anomaly apps, where user could handle these anomalies
|
* Fragment to show a list of anomaly apps, where user could handle these anomalies
|
||||||
*/
|
*/
|
||||||
public class RestrictedAppDetails extends DashboardFragment {
|
public class RestrictedAppDetails extends DashboardFragment implements
|
||||||
|
BatteryTipPreferenceController.BatteryTipListener {
|
||||||
|
|
||||||
public static final String TAG = "RestrictedAppDetails";
|
public static final String TAG = "RestrictedAppDetails";
|
||||||
|
|
||||||
@@ -145,12 +148,14 @@ public class RestrictedAppDetails extends DashboardFragment {
|
|||||||
Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
|
Utils.getBadgedIcon(mIconDrawableFactory, mPackageManager,
|
||||||
appInfo.packageName,
|
appInfo.packageName,
|
||||||
UserHandle.getUserId(appInfo.uid)));
|
UserHandle.getUserId(appInfo.uid)));
|
||||||
|
checkBoxPreference.setKey(getKeyFromAppInfo(appInfo));
|
||||||
checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
|
checkBoxPreference.setOnPreferenceChangeListener((pref, value) -> {
|
||||||
// change the toggle
|
final BatteryTipDialogFragment fragment = createDialogFragment(appInfo,
|
||||||
final int mode = (Boolean) value ? AppOpsManager.MODE_IGNORED
|
(Boolean) value);
|
||||||
: AppOpsManager.MODE_ALLOWED;
|
fragment.setTargetFragment(this, 0 /* requestCode */);
|
||||||
mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName, mode);
|
fragment.show(getFragmentManager(), TAG);
|
||||||
return true;
|
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
mRestrictedAppListGroup.addPreference(checkBoxPreference);
|
mRestrictedAppListGroup.addPreference(checkBoxPreference);
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
@@ -159,4 +164,35 @@ public class RestrictedAppDetails extends DashboardFragment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBatteryTipHandled(BatteryTip batteryTip) {
|
||||||
|
final AppInfo appInfo;
|
||||||
|
final boolean isRestricted = batteryTip instanceof RestrictAppTip;
|
||||||
|
if (isRestricted) {
|
||||||
|
appInfo = ((RestrictAppTip) batteryTip).getRestrictAppList().get(0);
|
||||||
|
} else {
|
||||||
|
appInfo = ((UnrestrictAppTip) batteryTip).getUnrestrictAppInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBoxPreference preference = (CheckBoxPreference) mRestrictedAppListGroup
|
||||||
|
.findPreference(getKeyFromAppInfo(appInfo));
|
||||||
|
if (preference != null) {
|
||||||
|
preference.setChecked(isRestricted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
BatteryTipDialogFragment createDialogFragment(AppInfo appInfo, boolean toRestrict) {
|
||||||
|
final BatteryTip batteryTip = toRestrict
|
||||||
|
? new RestrictAppTip(BatteryTip.StateType.NEW, appInfo)
|
||||||
|
: new UnrestrictAppTip(BatteryTip.StateType.NEW, appInfo);
|
||||||
|
|
||||||
|
return BatteryTipDialogFragment.newInstance(
|
||||||
|
batteryTip, getMetricsCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
String getKeyFromAppInfo(AppInfo appInfo) {
|
||||||
|
return appInfo.uid + "," + appInfo.packageName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -72,6 +72,10 @@ public class UnrestrictAppTip extends BatteryTip {
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AppInfo getUnrestrictAppInfo() {
|
||||||
|
return mAppInfo;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
super.writeToParcel(dest, flags);
|
super.writeToParcel(dest, flags);
|
||||||
|
@@ -21,7 +21,9 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.robolectric.Shadows.shadowOf;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
@@ -38,6 +40,11 @@ import android.widget.CheckBox;
|
|||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||||
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
import com.android.settings.fuelgauge.batterytip.AppInfo;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.BatteryTipDialogFragment;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip;
|
||||||
|
import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip;
|
||||||
|
import com.android.settings.testutils.SettingsRobolectricTestRunner;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -46,13 +53,15 @@ import org.mockito.Answers;
|
|||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
import org.robolectric.shadows.ShadowAlertDialog;
|
||||||
|
import org.robolectric.shadows.ShadowDialog;
|
||||||
|
import org.robolectric.util.FragmentTestUtil;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
public class RestrictedAppDetailsTest {
|
public class RestrictedAppDetailsTest {
|
||||||
|
|
||||||
private static final String PACKAGE_NAME = "com.android.app";
|
private static final String PACKAGE_NAME = "com.android.app";
|
||||||
@@ -60,20 +69,21 @@ public class RestrictedAppDetailsTest {
|
|||||||
private static final int UID = UserHandle.getUid(USER_ID, 234);
|
private static final int UID = UserHandle.getUid(USER_ID, 234);
|
||||||
private static final String APP_NAME = "app";
|
private static final String APP_NAME = "app";
|
||||||
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
@Mock
|
@Mock
|
||||||
private ApplicationInfo mApplicationInfo;
|
private ApplicationInfo mApplicationInfo;
|
||||||
@Mock
|
@Mock
|
||||||
private IconDrawableFactory mIconDrawableFactory;
|
private IconDrawableFactory mIconDrawableFactory;
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
|
||||||
private PreferenceManager mPreferenceManager;
|
|
||||||
@Mock
|
@Mock
|
||||||
private InstrumentedPreferenceFragment mFragment;
|
private InstrumentedPreferenceFragment mFragment;
|
||||||
|
private PreferenceManager mPreferenceManager;
|
||||||
private RestrictedAppDetails mRestrictedAppDetails;
|
private RestrictedAppDetails mRestrictedAppDetails;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private AppInfo mAppInfo;
|
private AppInfo mAppInfo;
|
||||||
private Intent mIntent;
|
private Intent mIntent;
|
||||||
|
private CheckBoxPreference mCheckBoxPreference;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -86,8 +96,9 @@ public class RestrictedAppDetailsTest {
|
|||||||
.setUid(UID)
|
.setUid(UID)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
mPreferenceManager = new PreferenceManager(mContext);
|
||||||
|
|
||||||
doReturn(mPreferenceManager).when(mRestrictedAppDetails).getPreferenceManager();
|
doReturn(mPreferenceManager).when(mRestrictedAppDetails).getPreferenceManager();
|
||||||
doReturn(mContext).when(mPreferenceManager).getContext();
|
|
||||||
doReturn(mContext).when(mFragment).getContext();
|
doReturn(mContext).when(mFragment).getContext();
|
||||||
mRestrictedAppDetails.mPackageManager = mPackageManager;
|
mRestrictedAppDetails.mPackageManager = mPackageManager;
|
||||||
mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
|
mRestrictedAppDetails.mIconDrawableFactory = mIconDrawableFactory;
|
||||||
@@ -97,10 +108,13 @@ public class RestrictedAppDetailsTest {
|
|||||||
mRestrictedAppDetails.mBatteryUtils = spy(new BatteryUtils(mContext));
|
mRestrictedAppDetails.mBatteryUtils = spy(new BatteryUtils(mContext));
|
||||||
doReturn(mPreferenceManager).when(
|
doReturn(mPreferenceManager).when(
|
||||||
mRestrictedAppDetails.mRestrictedAppListGroup).getPreferenceManager();
|
mRestrictedAppDetails.mRestrictedAppListGroup).getPreferenceManager();
|
||||||
|
|
||||||
|
mCheckBoxPreference = new CheckBoxPreference(mContext);
|
||||||
|
mCheckBoxPreference.setKey(mRestrictedAppDetails.getKeyFromAppInfo(mAppInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRefreshUi_displayPreference() throws Exception {
|
public void refreshUi_displayPreference() throws Exception {
|
||||||
doReturn(mApplicationInfo).when(mPackageManager)
|
doReturn(mApplicationInfo).when(mPackageManager)
|
||||||
.getApplicationInfoAsUser(PACKAGE_NAME, 0, USER_ID);
|
.getApplicationInfoAsUser(PACKAGE_NAME, 0, USER_ID);
|
||||||
doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
|
doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
|
||||||
@@ -117,7 +131,7 @@ public class RestrictedAppDetailsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStartRestrictedAppDetails_startWithCorrectData() {
|
public void startRestrictedAppDetails_startWithCorrectData() {
|
||||||
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
|
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
|
||||||
doAnswer(invocation -> {
|
doAnswer(invocation -> {
|
||||||
// Get the intent in which it has the app info bundle
|
// Get the intent in which it has the app info bundle
|
||||||
@@ -135,4 +149,50 @@ public class RestrictedAppDetailsTest {
|
|||||||
RestrictedAppDetails.EXTRA_APP_INFO_LIST);
|
RestrictedAppDetails.EXTRA_APP_INFO_LIST);
|
||||||
assertThat(appInfos).containsExactly(mAppInfo);
|
assertThat(appInfos).containsExactly(mAppInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createDialogFragment_toRestrict_createRestrictDialog() {
|
||||||
|
final BatteryTipDialogFragment dialogFragment = mRestrictedAppDetails.createDialogFragment(
|
||||||
|
mAppInfo, true);
|
||||||
|
|
||||||
|
FragmentTestUtil.startFragment(dialogFragment);
|
||||||
|
|
||||||
|
final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
|
||||||
|
ShadowAlertDialog shadowDialog = shadowOf(dialog);
|
||||||
|
assertThat(shadowDialog.getTitle()).isEqualTo("Restrict app?");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createDialogFragment_toUnrestrict_createUnrestrictDialog() {
|
||||||
|
final BatteryTipDialogFragment dialogFragment = mRestrictedAppDetails.createDialogFragment(
|
||||||
|
mAppInfo, false);
|
||||||
|
|
||||||
|
FragmentTestUtil.startFragment(dialogFragment);
|
||||||
|
|
||||||
|
final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
|
||||||
|
ShadowAlertDialog shadowDialog = shadowOf(dialog);
|
||||||
|
assertThat(shadowDialog.getTitle()).isEqualTo("Remove restriction?");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onBatteryTipHandled_restrict_setChecked() {
|
||||||
|
final RestrictAppTip restrictAppTip = new RestrictAppTip(BatteryTip.StateType.NEW,
|
||||||
|
mAppInfo);
|
||||||
|
mRestrictedAppDetails.mRestrictedAppListGroup.addPreference(mCheckBoxPreference);
|
||||||
|
|
||||||
|
mRestrictedAppDetails.onBatteryTipHandled(restrictAppTip);
|
||||||
|
|
||||||
|
assertThat(mCheckBoxPreference.isChecked()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onBatteryTipHandled_unrestrict_setUnchecked() {
|
||||||
|
final UnrestrictAppTip unrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW,
|
||||||
|
mAppInfo);
|
||||||
|
mRestrictedAppDetails.mRestrictedAppListGroup.addPreference(mCheckBoxPreference);
|
||||||
|
|
||||||
|
mRestrictedAppDetails.onBatteryTipHandled(unrestrictAppTip);
|
||||||
|
|
||||||
|
assertThat(mCheckBoxPreference.isChecked()).isFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user