import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
+import android.os.Bundle;
import android.permission.PermissionControllerManager;
import android.permission.RuntimePermissionUsageInfo;
import android.provider.DeviceConfig;
import android.view.View;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.Utils;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnCreate;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.widget.BarChartInfo;
import com.android.settingslib.widget.BarChartPreference;
public class PermissionBarChartPreferenceController extends BasePreferenceController implements
- PermissionControllerManager.OnPermissionUsageResultCallback, LifecycleObserver, OnStart {
+ PermissionControllerManager.OnPermissionUsageResultCallback, LifecycleObserver, OnCreate,
+ OnStart, OnSaveInstanceState {
private static final String TAG = "BarChartPreferenceCtl";
+ private static final String KEY_PERMISSION_USAGE = "usage_infos";
+ @VisibleForTesting
+ List<RuntimePermissionUsageInfo> mOldUsageInfos;
private PackageManager mPackageManager;
private PrivacyDashboardFragment mParent;
private BarChartPreference mBarChartPreference;
- private List<RuntimePermissionUsageInfo> mOldUsageInfos;
public PermissionBarChartPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
}
@Override
+ public void onCreate(Bundle savedInstanceState) {
+ if (savedInstanceState != null) {
+ mOldUsageInfos = savedInstanceState.getParcelableArrayList(KEY_PERMISSION_USAGE);
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putParcelableList(KEY_PERMISSION_USAGE, mOldUsageInfos);
+ }
+
+ @Override
public int getAvailabilityStatus() {
return Boolean.parseBoolean(
DeviceConfig.getProperty(DeviceConfig.Privacy.NAMESPACE,
.build();
mBarChartPreference.initializeBarChart(info);
+ if (!mOldUsageInfos.isEmpty()) {
+ mBarChartPreference.setBarViewInfos(createBarViews(mOldUsageInfos));
+ }
}
@Override
return;
}
- mBarChartPreference.updateLoadingState(true /* isLoading */);
+ // We don't hide chart when we have existing data.
+ mBarChartPreference.updateLoadingState(mOldUsageInfos.isEmpty() /* isLoading */);
+ // But we still need to hint user with progress bar that we are updating new usage data.
mParent.setLoadingEnabled(true /* enabled */);
retrievePermissionUsageData();
}
}
@Test
+ public void displayPreference_usageInfosSet_shouldSetBarViewInfos() {
+ final RuntimePermissionUsageInfo info1 =
+ new RuntimePermissionUsageInfo("permission 1", 10);
+ mController.mOldUsageInfos.add(info1);
+
+ mController.displayPreference(mScreen);
+
+ verify(mPreference).setBarViewInfos(any(BarViewInfo[].class));
+ verify(mPreference).initializeBarChart(any(BarChartInfo.class));
+ }
+
+ @Test
public void onPermissionUsageResult_differentPermissionResultSet_shouldSetBarViewInfos() {
final List<RuntimePermissionUsageInfo> infos1 = new ArrayList<>();
final RuntimePermissionUsageInfo info1 =
}
@Test
- public void onStart_permissionHubEnabled_shouldShowProgressBar() {
+ public void onStart_usageInfosNotSetAndPermissionHubEnabled_shouldShowProgressBar() {
DeviceConfig.setProperty(DeviceConfig.Privacy.NAMESPACE,
DeviceConfig.Privacy.PROPERTY_PERMISSIONS_HUB_ENABLED, "true", true);
mController.displayPreference(mScreen);
}
@Test
+ public void onStart_usageInfosSetAndPermissionHubEnabled_shouldNotUpdatePrefLoadingState() {
+ DeviceConfig.setProperty(DeviceConfig.Privacy.NAMESPACE,
+ DeviceConfig.Privacy.PROPERTY_PERMISSIONS_HUB_ENABLED, "true", true);
+ final RuntimePermissionUsageInfo info1 =
+ new RuntimePermissionUsageInfo("permission 1", 10);
+ mController.mOldUsageInfos.add(info1);
+ mController.displayPreference(mScreen);
+
+ mController.onStart();
+
+ verify(mFragment).setLoadingEnabled(true /* enabled */);
+ verify(mPreference).updateLoadingState(false /* isLoading */);
+ }
+
+ @Test
public void onStart_permissionHubDisabled_shouldNotShowProgressBar() {
DeviceConfig.setProperty(DeviceConfig.Privacy.NAMESPACE,
DeviceConfig.Privacy.PROPERTY_PERMISSIONS_HUB_ENABLED, "false", false);