Merge "Add Tapjacking Protection for SettingsHomepageActivity" into qt-qpr1-dev
diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml
index 3ac6f42..1dd609e 100644
--- a/res/xml/privacy_dashboard_settings.xml
+++ b/res/xml/privacy_dashboard_settings.xml
@@ -22,13 +22,6 @@
     android:title="@string/privacy_dashboard_title"
     settings:initialExpandedChildrenCount="4">
 
-    <!-- This preference isn't searchable, and user won't see title in this preference.
-         So, we just set empty text for title. -->
-    <com.android.settingslib.widget.BarChartPreference
-        android:key="permission_bar_chart"
-        android:title="@string/summary_placeholder"
-        settings:controller="com.android.settings.privacy.PermissionBarChartPreferenceController"/>
-
     <!-- Work Policy info -->
     <Preference
         android:key="work_policy_info"
diff --git a/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java b/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java
index 36a3980..1b7f003 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSlice.java
@@ -17,15 +17,21 @@
 
 import static androidx.slice.builders.ListBuilder.ICON_IMAGE;
 
+import static android.provider.Settings.Global.LOW_POWER_MODE;
+
 import android.annotation.ColorInt;
 import android.app.PendingIntent;
 import android.app.UiModeManager;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
+import android.database.ContentObserver;
 import android.net.Uri;
 import android.os.BatteryManager;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.PowerManager;
+import android.provider.Settings;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -39,6 +45,9 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.slices.CustomSliceRegistry;
 import com.android.settings.slices.CustomSliceable;
+import com.android.settings.slices.SliceBackgroundWorker;
+
+import java.io.IOException;
 
 public class DarkThemeSlice implements CustomSliceable {
     private static final String TAG = "DarkThemeSlice";
@@ -53,10 +62,12 @@
 
     private final Context mContext;
     private final UiModeManager mUiModeManager;
+    private final PowerManager mPowerManager;
 
     public DarkThemeSlice(Context context) {
         mContext = context;
         mUiModeManager = context.getSystemService(UiModeManager.class);
+        mPowerManager = context.getSystemService(PowerManager.class);
     }
 
     @Override
@@ -67,15 +78,18 @@
             sActiveUiSession = currentUiSession;
             sKeepSliceShow = false;
         }
-        if (!sKeepSliceShow && !isAvailable(mContext)) {
-            return null;
+        // Dark theme slice will disappear when battery saver is ON.
+        if (mPowerManager.isPowerSaveMode() || (!sKeepSliceShow && !isAvailable(mContext))) {
+            return new ListBuilder(mContext, CustomSliceRegistry.DARK_THEME_SLICE_URI,
+                    ListBuilder.INFINITY)
+                    .setIsError(true)
+                    .build();
         }
         sKeepSliceShow = true;
         final PendingIntent toggleAction = getBroadcastIntent(mContext);
         @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
         final IconCompat icon =
                 IconCompat.createWithResource(mContext, R.drawable.dark_theme);
-        final boolean isChecked = mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES;
         return new ListBuilder(mContext, CustomSliceRegistry.DARK_THEME_SLICE_URI,
                 ListBuilder.INFINITY)
                 .setAccentColor(color)
@@ -85,7 +99,7 @@
                         .setSubtitle(mContext.getText(R.string.dark_theme_slice_subtitle))
                         .setPrimaryAction(
                                 SliceAction.createToggle(toggleAction, null /* actionTitle */,
-                                        isChecked)))
+                                        isDarkThemeMode(mContext))))
                 .build();
     }
 
@@ -100,8 +114,7 @@
                 false);
         // make toggle transition more smooth before dark theme takes effect
         new Handler(Looper.getMainLooper()).postDelayed(() -> {
-            mUiModeManager.setNightMode(
-                isChecked ? UiModeManager.MODE_NIGHT_YES : UiModeManager.MODE_NIGHT_NO);
+            mUiModeManager.setNightModeActivated(isChecked);
         }, DELAY_TIME_EXECUTING_DARK_THEME);
     }
 
@@ -110,10 +123,15 @@
         return null;
     }
 
+    @Override
+    public Class getBackgroundWorkerClass() {
+        return DarkThemeWorker.class;
+    }
+
     @VisibleForTesting
     boolean isAvailable(Context context) {
         // checking dark theme mode.
-        if (mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES) {
+        if (isDarkThemeMode(context)) {
             return false;
         }
 
@@ -121,7 +139,47 @@
         final BatteryManager batteryManager = context.getSystemService(BatteryManager.class);
         final int level = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
         Log.d(TAG, "battery level=" + level);
-
         return level <= BATTERY_LEVEL_THRESHOLD;
     }
+
+    @VisibleForTesting
+    boolean isDarkThemeMode(Context context) {
+        final int currentNightMode =
+                context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
+        return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
+    }
+
+    public static class DarkThemeWorker extends SliceBackgroundWorker<Void> {
+        private final Context mContext;
+        private final ContentObserver mContentObserver =
+                new ContentObserver(new Handler(Looper.getMainLooper())) {
+                    @Override
+                    public void onChange(boolean bChanged) {
+                        if (mContext.getSystemService(PowerManager.class).isPowerSaveMode()) {
+                            notifySliceChange();
+                        }
+                    }
+                };
+
+        public DarkThemeWorker(Context context, Uri uri) {
+            super(context, uri);
+            mContext = context;
+        }
+
+        @Override
+        protected void onSlicePinned() {
+            mContext.getContentResolver().registerContentObserver(
+                    Settings.Global.getUriFor(LOW_POWER_MODE), false /* notifyForDescendants */,
+                    mContentObserver);
+        }
+
+        @Override
+        protected void onSliceUnpinned() {
+            mContext.getContentResolver().unregisterContentObserver(mContentObserver);
+        }
+
+        @Override
+        public void close() throws IOException {
+        }
+    }
 }
diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
deleted file mode 100644
index 28533df..0000000
--- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.privacy;
-
-import static android.Manifest.permission_group.CAMERA;
-import static android.Manifest.permission_group.LOCATION;
-import static android.Manifest.permission_group.MICROPHONE;
-
-import static java.util.concurrent.TimeUnit.DAYS;
-
-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;
-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;
-import com.android.settingslib.widget.BarViewInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class PermissionBarChartPreferenceController extends BasePreferenceController implements
-        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;
-
-    public PermissionBarChartPreferenceController(Context context, String preferenceKey) {
-        super(context, preferenceKey);
-        mOldUsageInfos = new ArrayList<>();
-        mPackageManager = context.getPackageManager();
-    }
-
-    public void setFragment(PrivacyDashboardFragment fragment) {
-        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 UNSUPPORTED_ON_DEVICE;
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mBarChartPreference = screen.findPreference(getPreferenceKey());
-
-        final BarChartInfo info = new BarChartInfo.Builder()
-                .setTitle(R.string.permission_bar_chart_title)
-                .setDetails(R.string.permission_bar_chart_details)
-                .setEmptyText(R.string.permission_bar_chart_empty_text)
-                .setDetailsOnClickListener((View v) -> {
-                    final Intent intent = new Intent(Intent.ACTION_REVIEW_PERMISSION_USAGE);
-                    intent.putExtra(Intent.EXTRA_DURATION_MILLIS, DAYS.toMillis(1));
-                    mContext.startActivity(intent);
-                })
-                .build();
-
-        mBarChartPreference.initializeBarChart(info);
-        if (!mOldUsageInfos.isEmpty()) {
-            mBarChartPreference.setBarViewInfos(createBarViews(mOldUsageInfos));
-        }
-    }
-
-    @Override
-    public void onStart() {
-        if (!isAvailable()) {
-            return;
-        }
-
-        // 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();
-    }
-
-    @Override
-    public void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> usageInfos) {
-        usageInfos.sort((x, y) -> {
-            int usageDiff = y.getAppAccessCount() - x.getAppAccessCount();
-            if (usageDiff != 0) {
-                return usageDiff;
-            }
-            String xName = x.getName();
-            String yName = y.getName();
-            if (xName.equals(LOCATION)) {
-                return -1;
-            } else if (yName.equals(LOCATION)) {
-                return 1;
-            } else if (xName.equals(MICROPHONE)) {
-                return -1;
-            } else if (yName.equals(MICROPHONE)) {
-                return 1;
-            } else if (xName.equals(CAMERA)) {
-                return -1;
-            } else if (yName.equals(CAMERA)) {
-                return 1;
-            }
-            return x.getName().compareTo(y.getName());
-        });
-
-        // If the result is different, we need to update bar views.
-        if (!areSamePermissionGroups(usageInfos)) {
-            mBarChartPreference.setBarViewInfos(createBarViews(usageInfos));
-            mOldUsageInfos = usageInfos;
-        }
-
-        mBarChartPreference.updateLoadingState(false /* isLoading */);
-        mParent.setLoadingEnabled(false /* enabled */);
-    }
-
-    private void retrievePermissionUsageData() {
-        mContext.getSystemService(PermissionControllerManager.class).getPermissionUsages(
-                false /* countSystem */, (int) DAYS.toMillis(1),
-                mContext.getMainExecutor() /* executor */, this /* callback */);
-    }
-
-    private BarViewInfo[] createBarViews(List<RuntimePermissionUsageInfo> usageInfos) {
-        if (usageInfos.isEmpty()) {
-            return null;
-        }
-
-        final BarViewInfo[] barViewInfos = new BarViewInfo[
-                Math.min(BarChartPreference.MAXIMUM_BAR_VIEWS, usageInfos.size())];
-
-        for (int index = 0; index < barViewInfos.length; index++) {
-            final RuntimePermissionUsageInfo permissionGroupInfo = usageInfos.get(index);
-            final int count = permissionGroupInfo.getAppAccessCount();
-            final CharSequence permLabel = getPermissionGroupLabel(permissionGroupInfo.getName());
-
-            barViewInfos[index] = new BarViewInfo(
-                    getPermissionGroupIcon(permissionGroupInfo.getName()), count, permLabel,
-                    mContext.getResources().getQuantityString(R.plurals.permission_bar_chart_label,
-                            count, count), permLabel);
-
-            // Set the click listener for each bar view.
-            // The listener will navigate user to permission usage app.
-            barViewInfos[index].setClickListener((View v) -> {
-                final Intent intent = new Intent(Intent.ACTION_REVIEW_PERMISSION_USAGE);
-                intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, permissionGroupInfo.getName());
-                intent.putExtra(Intent.EXTRA_DURATION_MILLIS, DAYS.toMillis(1));
-                mContext.startActivity(intent);
-            });
-        }
-
-        return barViewInfos;
-    }
-
-    private Drawable getPermissionGroupIcon(String permissionGroup) {
-        Drawable icon = null;
-        try {
-            icon = mPackageManager.getPermissionGroupInfo(permissionGroup, 0)
-                    .loadIcon(mPackageManager);
-            icon.setTintList(Utils.getColorAttr(mContext, android.R.attr.textColorSecondary));
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.w(TAG, "Cannot find group icon for " + permissionGroup, e);
-        }
-
-        return icon;
-    }
-
-    private CharSequence getPermissionGroupLabel(String permissionGroup) {
-        CharSequence label = null;
-        try {
-            label = mPackageManager.getPermissionGroupInfo(permissionGroup, 0)
-                    .loadLabel(mPackageManager);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.w(TAG, "Cannot find group label for " + permissionGroup, e);
-        }
-
-        return label;
-    }
-
-    private boolean areSamePermissionGroups(List<RuntimePermissionUsageInfo> newUsageInfos) {
-        if (newUsageInfos.size() != mOldUsageInfos.size()) {
-            return false;
-        }
-
-        for (int index = 0; index < newUsageInfos.size(); index++) {
-            final RuntimePermissionUsageInfo newInfo = newUsageInfos.get(index);
-            final RuntimePermissionUsageInfo oldInfo = mOldUsageInfos.get(index);
-
-            if (!newInfo.getName().equals(oldInfo.getName()) ||
-                    newInfo.getAppAccessCount() != oldInfo.getAppAccessCount()) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/src/com/android/settings/privacy/PrivacyDashboardFragment.java b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
index fa21f9d..1869cff 100644
--- a/src/com/android/settings/privacy/PrivacyDashboardFragment.java
+++ b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
@@ -18,14 +18,12 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.os.Bundle;
 import android.provider.SearchIndexableResource;
 import android.view.View;
 
 import androidx.annotation.VisibleForTesting;
 
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -75,34 +73,6 @@
         return buildPreferenceControllers(context, getSettingsLifecycle());
     }
 
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        use(PermissionBarChartPreferenceController.class).setFragment(this /* fragment */);
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        Utils.setActionBarShadowAnimation(getActivity(), getSettingsLifecycle(), getListView());
-        initLoadingBar();
-    }
-
-    @VisibleForTesting
-    void initLoadingBar() {
-        mProgressHeader = setPinnedHeaderView(R.layout.progress_header);
-        mProgressAnimation = mProgressHeader.findViewById(R.id.progress_bar_animation);
-        setLoadingEnabled(false);
-    }
-
-    @VisibleForTesting
-    void setLoadingEnabled(boolean enabled) {
-        if (mProgressHeader != null && mProgressAnimation != null) {
-            mProgressHeader.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
-            mProgressAnimation.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
-        }
-    }
-
     private static List<AbstractPreferenceController> buildPreferenceControllers(
             Context context, Lifecycle lifecycle) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSliceTest.java
index bb21332..1af7b2b 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSliceTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/DarkThemeSliceTest.java
@@ -22,10 +22,10 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
-import android.app.UiModeManager;
 import android.content.Context;
 import android.net.Uri;
 import android.os.BatteryManager;
+import android.os.PowerManager;
 
 import androidx.slice.Slice;
 import androidx.slice.SliceMetadata;
@@ -48,9 +48,9 @@
 @RunWith(RobolectricTestRunner.class)
 public class DarkThemeSliceTest {
     @Mock
-    private UiModeManager mUiModeManager;
-    @Mock
     private BatteryManager mBatteryManager;
+    @Mock
+    private PowerManager mPowerManager;
 
     private Context mContext;
     private DarkThemeSlice mDarkThemeSlice;
@@ -63,11 +63,12 @@
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         mFeatureFactory.slicesFeatureProvider = new SlicesFeatureProviderImpl();
         mFeatureFactory.slicesFeatureProvider.newUiSession();
-        doReturn(mUiModeManager).when(mContext).getSystemService(UiModeManager.class);
+        doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class);
+        when(mPowerManager.isPowerSaveMode()).thenReturn(false);
 
         // Set-up specs for SliceMetadata.
         SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
-        mDarkThemeSlice = new DarkThemeSlice(mContext);
+        mDarkThemeSlice = spy(new DarkThemeSlice(mContext));
         mDarkThemeSlice.sKeepSliceShow = false;
     }
 
@@ -80,7 +81,7 @@
 
     @Test
     public void isAvailable_inDarkThemeMode_returnFalse() {
-        when(mUiModeManager.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
+        doReturn(true).when(mDarkThemeSlice).isDarkThemeMode(mContext);
 
         assertThat(mDarkThemeSlice.isAvailable(mContext)).isFalse();
     }
@@ -100,23 +101,36 @@
     }
 
     @Test
-    public void getSlice_notAvailable_returnNull() {
-        when(mUiModeManager.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
+    public void getSlice_batterySaver_returnErrorSlice() {
+        when(mPowerManager.isPowerSaveMode()).thenReturn(true);
 
-        assertThat(mDarkThemeSlice.getSlice()).isNull();
+        final Slice mediaSlice = mDarkThemeSlice.getSlice();
+        final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
+        assertThat(metadata.isErrorSlice()).isTrue();
     }
 
     @Test
-    public void getSlice_newSession_notAvailable_returnNull() {
+    public void getSlice_notAvailable_returnErrorSlice() {
+        doReturn(true).when(mDarkThemeSlice).isDarkThemeMode(mContext);
+
+        final Slice mediaSlice = mDarkThemeSlice.getSlice();
+        final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
+        assertThat(metadata.isErrorSlice()).isTrue();
+    }
+
+    @Test
+    public void getSlice_newSession_notAvailable_returnErrorSlice() {
         // previous displayed: yes
         mDarkThemeSlice.sKeepSliceShow = true;
         // Session: use original value + 1 to become a new session
         mDarkThemeSlice.sActiveUiSession =
                 mFeatureFactory.slicesFeatureProvider.getUiSessionToken() + 1;
 
-        when(mUiModeManager.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_YES);
+        doReturn(true).when(mDarkThemeSlice).isDarkThemeMode(mContext);
 
-        assertThat(mDarkThemeSlice.getSlice()).isNull();
+        final Slice mediaSlice = mDarkThemeSlice.getSlice();
+        final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
+        assertThat(metadata.isErrorSlice()).isTrue();
     }
 
     @Test
@@ -149,7 +163,7 @@
     }
 
     private void setBatteryCapacityLevel(int power_level) {
-        when(mUiModeManager.getNightMode()).thenReturn(UiModeManager.MODE_NIGHT_NO);
+        doReturn(false).when(mDarkThemeSlice).isDarkThemeMode(mContext);
         doReturn(mBatteryManager).when(mContext).getSystemService(BatteryManager.class);
         when(mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY))
                 .thenReturn(power_level);
diff --git a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
deleted file mode 100644
index 1335db5..0000000
--- a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.privacy;
-
-import static android.Manifest.permission_group.CALENDAR;
-import static android.Manifest.permission_group.CAMERA;
-import static android.Manifest.permission_group.CONTACTS;
-import static android.Manifest.permission_group.LOCATION;
-import static android.Manifest.permission_group.MICROPHONE;
-import static android.Manifest.permission_group.PHONE;
-import static android.Manifest.permission_group.SMS;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
-import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.UserManager;
-import android.permission.RuntimePermissionUsageInfo;
-import android.provider.DeviceConfig;
-import android.view.accessibility.AccessibilityManager;
-
-import androidx.preference.PreferenceScreen;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.Utils;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.shadow.ShadowDeviceConfig;
-import com.android.settings.testutils.shadow.ShadowPermissionControllerManager;
-import com.android.settings.testutils.shadow.ShadowUserManager;
-import com.android.settingslib.widget.BarChartInfo;
-import com.android.settingslib.widget.BarChartPreference;
-import com.android.settingslib.widget.BarViewInfo;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowAccessibilityManager;
-import org.robolectric.shadows.androidx.fragment.FragmentController;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowDeviceConfig.class, ShadowUserManager.class,
-        ShadowPermissionControllerManager.class})
-public class PermissionBarChartPreferenceControllerTest {
-
-    @Mock
-    private PreferenceScreen mScreen;
-    @Mock
-    private LockPatternUtils mLockPatternUtils;
-
-    private PermissionBarChartPreferenceController mController;
-    private BarChartPreference mPreference;
-    private PrivacyDashboardFragment mFragment;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        final Context context = RuntimeEnvironment.application;
-        final UserManager userManager = context.getSystemService(UserManager.class);
-        final ShadowUserManager shadowUserManager = Shadow.extract(userManager);
-        final ShadowAccessibilityManager accessibilityManager = Shadow.extract(
-                AccessibilityManager.getInstance(context));
-        accessibilityManager.setEnabledAccessibilityServiceList(new ArrayList<>());
-        shadowUserManager.addProfile(new UserInfo(123, null, 0));
-        when(FakeFeatureFactory.setupForTest().securityFeatureProvider.getLockPatternUtils(
-                any(Context.class))).thenReturn(mLockPatternUtils);
-
-        mController = spy(new PermissionBarChartPreferenceController(context, "test_key"));
-        mFragment = spy(FragmentController.of(new PrivacyDashboardFragment())
-                .create().start().get());
-        mController.setFragment(mFragment);
-        mPreference = spy(new BarChartPreference(context));
-        when(mScreen.findPreference(mController.getPreferenceKey()))
-                .thenReturn((BarChartPreference) mPreference);
-    }
-
-    @After
-    public void tearDown() {
-        ShadowDeviceConfig.reset();
-    }
-
-    @Test
-    public void getAvailabilityStatus_permissionHubNotSet_shouldReturnUnsupported() {
-        // We have not yet set the property to show the Permissions Hub.
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java
deleted file mode 100644
index 80f3900..0000000
--- a/tests/robotests/src/com/android/settings/privacy/PrivacyDashboardFragmentTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.privacy;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.permission.PermissionControllerManager;
-import android.view.View;
-import android.view.accessibility.AccessibilityManager;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.shadow.ShadowPermissionControllerManager;
-import com.android.settings.testutils.shadow.ShadowUserManager;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-import org.robolectric.shadows.ShadowAccessibilityManager;
-import org.robolectric.shadows.androidx.fragment.FragmentController;
-
-import java.util.ArrayList;
-
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowPermissionControllerManager.class})
-public class PrivacyDashboardFragmentTest {
-
-    @Mock
-    private LockPatternUtils mLockPatternUtils;
-    @Mock
-    private PermissionControllerManager mPCM;
-
-    private Context mContext;
-    private PrivacyDashboardFragment mFragment;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
-        final UserManager userManager = mContext.getSystemService(UserManager.class);
-        final ShadowUserManager shadowUserManager = Shadow.extract(userManager);
-        final ShadowAccessibilityManager accessibilityManager = Shadow.extract(
-                AccessibilityManager.getInstance(mContext));
-        accessibilityManager.setEnabledAccessibilityServiceList(new ArrayList<>());
-        shadowUserManager.addProfile(new UserInfo(123, null, 0));
-        when(FakeFeatureFactory.setupForTest().securityFeatureProvider.getLockPatternUtils(
-                any(Context.class))).thenReturn(mLockPatternUtils);
-        mFragment = spy(FragmentController.of(new PrivacyDashboardFragment())
-                .create().start().get());
-    }
-
-    @Test
-    public void onViewCreated_shouldSetActionBarShadowAnimation() {
-        mFragment.onViewCreated(new View(mContext), new Bundle());
-
-        assertThat(mFragment.getActivity().getActionBar().getElevation()).isEqualTo(0.f);
-    }
-
-    @Test
-    public void onViewCreated_shouldInitLinearProgressBar() {
-        mFragment.onViewCreated(new View(mContext), new Bundle());
-
-        verify(mFragment).initLoadingBar();
-    }
-
-    @Test
-    public void updateLinearProgressbar_isVisible_shouldShowProgressBar() {
-        mFragment.setLoadingEnabled(true /* enabled */);
-
-        assertThat(mFragment.mProgressHeader.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(mFragment.mProgressAnimation.getVisibility()).isEqualTo(View.VISIBLE);
-    }
-
-    @Test
-    public void updateLinearProgressbar_isInVisible_shouldHideProgressBar() {
-        mFragment.setLoadingEnabled(false /* enabled */);
-
-        assertThat(mFragment.mProgressHeader.getVisibility()).isEqualTo(View.INVISIBLE);
-        assertThat(mFragment.mProgressAnimation.getVisibility()).isEqualTo(View.INVISIBLE);
-    }
-}