diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java index 2c6368e9468..453cdbfaf86 100644 --- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java +++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java @@ -24,6 +24,7 @@ import android.content.Context; 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; @@ -31,12 +32,15 @@ import android.util.Log; 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; @@ -48,14 +52,17 @@ import java.util.List; 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 mOldUsageInfos; private PackageManager mPackageManager; private PrivacyDashboardFragment mParent; private BarChartPreference mBarChartPreference; - private List mOldUsageInfos; public PermissionBarChartPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -67,6 +74,18 @@ public class PermissionBarChartPreferenceController extends BasePreferenceContro mParent = fragment; } + @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( @@ -92,6 +111,9 @@ public class PermissionBarChartPreferenceController extends BasePreferenceContro .build(); mBarChartPreference.initializeBarChart(info); + if (!mOldUsageInfos.isEmpty()) { + mBarChartPreference.setBarViewInfos(createBarViews(mOldUsageInfos)); + } } @Override @@ -100,7 +122,9 @@ public class PermissionBarChartPreferenceController extends BasePreferenceContro 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(); } diff --git a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java index f664f4f9140..332156e8b9a 100644 --- a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java @@ -124,6 +124,18 @@ public class PermissionBarChartPreferenceControllerTest { verify(mPreference).initializeBarChart(any(BarChartInfo.class)); } + @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 infos1 = new ArrayList<>(); @@ -159,7 +171,7 @@ public class PermissionBarChartPreferenceControllerTest { } @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); @@ -170,6 +182,21 @@ public class PermissionBarChartPreferenceControllerTest { verify(mPreference).updateLoadingState(true /* isLoading */); } + @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,