Merge "Add action log in "Restrict app page"." into pi-dev
am: 8075586a2e
Change-Id: Ie4387d9d5cc05742b26bda9bcd27eca49755809e
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