Files
app_Settings/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
Arc Wang 51b3e7a093 Storage Settings hides categories when loading
To hide sorting animation.

- Storage Settings always loads cache and updates UI, then
  loads storage size and updates UI.
  Remove the chche design because storage category preferences
  will hide during loading, it no meaning to load from cache
  and update UI.

- Hides loading circle before storage category preferences
  become visible, it prevents flickers.

- Remove Calculating... summary of StorageItemPreference.

- Private storage category preferences and secondary user
  preference become visible at
  StorageItemPreferenceController#onLoadFinished.

Bug: 188731179
Bug: 185547228
Bug: 188615591
Test: atest com.android.settings.deviceinfo
      atest com.android.settings.deviceinfo.storage
      make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.deviceinfo
      make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.deviceinfo.storage
      manual visual
Change-Id: I3ebef5829ef4f806add07f58fa02520804768be5
2021-06-04 11:50:12 +08:00

231 lines
7.3 KiB
Java

/*
* Copyright (C) 2017 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.deviceinfo.storage;
import android.content.Context;
import android.content.pm.UserInfo;
import android.graphics.drawable.Drawable;
import android.os.UserManager;
import android.util.SparseArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.deviceinfo.StorageItemPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.ArrayList;
import java.util.List;
/**
* SecondaryUserController controls the preferences on the Storage screen which had to do with
* secondary users.
*/
public class SecondaryUserController extends AbstractPreferenceController implements
PreferenceControllerMixin, StorageAsyncLoader.ResultHandler,
UserIconLoader.UserIconHandler {
// PreferenceGroupKey to try to add our preference onto.
private static final String TARGET_PREFERENCE_GROUP_KEY = "pref_secondary_users";
private static final String PREFERENCE_KEY_BASE = "pref_user_";
private static final int USER_PROFILE_INSERTION_LOCATION = 6;
private static final int SIZE_NOT_SET = -1;
private @NonNull
UserInfo mUser;
private @Nullable
StorageItemPreference mStoragePreference;
private PreferenceGroup mPreferenceGroup;
private Drawable mUserIcon;
private long mSize;
private long mTotalSizeBytes;
private boolean mIsVisible;
/**
* Adds the appropriate controllers to a controller list for handling all secondary users on
* a device.
*
* @param context Context for initializing the preference controllers.
* @param userManager UserManagerWrapper for figuring out which controllers to add.
* @param isWorkProfileOnly only shows secondary users of work profile.
* (e.g., it should be true in work profile tab)
*/
public static List<AbstractPreferenceController> getSecondaryUserControllers(
Context context, UserManager userManager, boolean isWorkProfileOnly) {
List<AbstractPreferenceController> controllers = new ArrayList<>();
UserInfo primaryUser = userManager.getPrimaryUser();
boolean addedUser = false;
List<UserInfo> infos = userManager.getUsers();
for (int i = 0, size = infos.size(); i < size; i++) {
UserInfo info = infos.get(i);
if (info.isPrimary()) {
continue;
}
if (Utils.isProfileOf(primaryUser, info)) {
continue;
}
if (isWorkProfileOnly && !info.isManagedProfile()) {
continue;
}
controllers.add(new SecondaryUserController(context, info));
addedUser = true;
}
if (!addedUser) {
controllers.add(new NoSecondaryUserController(context));
}
return controllers;
}
/**
* Constructor for a given secondary user.
*
* @param context Context to initialize the underlying {@link AbstractPreferenceController}.
* @param info {@link UserInfo} for the secondary user which this controllers covers.
*/
@VisibleForTesting
SecondaryUserController(Context context, @NonNull UserInfo info) {
super(context);
mUser = info;
mSize = SIZE_NOT_SET;
}
@Override
public void displayPreference(PreferenceScreen screen) {
if (mStoragePreference == null) {
mStoragePreference = new StorageItemPreference(screen.getContext());
mPreferenceGroup = screen.findPreference(TARGET_PREFERENCE_GROUP_KEY);
mStoragePreference.setTitle(mUser.name);
mStoragePreference.setKey(PREFERENCE_KEY_BASE + mUser.id);
if (mSize != SIZE_NOT_SET) {
mStoragePreference.setStorageSize(mSize, mTotalSizeBytes);
}
mPreferenceGroup.setVisible(mIsVisible);
mPreferenceGroup.addPreference(mStoragePreference);
maybeSetIcon();
}
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return mStoragePreference != null ? mStoragePreference.getKey() : null;
}
/**
* Returns the user for which this is the secondary user controller.
*/
@NonNull
public UserInfo getUser() {
return mUser;
}
/**
* Sets the size for the preference.
*
* @param size Size in bytes.
*/
public void setSize(long size) {
mSize = size;
if (mStoragePreference != null) {
mStoragePreference.setStorageSize(mSize, mTotalSizeBytes);
}
}
/**
* Sets the total size for the preference for the progress bar.
*
* @param totalSizeBytes Total size in bytes.
*/
public void setTotalSize(long totalSizeBytes) {
mTotalSizeBytes = totalSizeBytes;
}
/**
* Sets visibility of the PreferenceGroup of secondary user.
*
* @param visible Visibility of the PreferenceGroup.
*/
public void setPreferenceGroupVisible(boolean visible) {
mIsVisible = visible;
if (mPreferenceGroup != null) {
mPreferenceGroup.setVisible(mIsVisible);
}
}
@Override
public void handleResult(SparseArray<StorageAsyncLoader.StorageResult> stats) {
final StorageAsyncLoader.StorageResult result = stats.get(getUser().id);
if (result != null) {
setSize(result.externalStats.totalBytes);
}
}
@Override
public void handleUserIcons(SparseArray<Drawable> fetchedIcons) {
mUserIcon = fetchedIcons.get(mUser.id);
maybeSetIcon();
}
private void maybeSetIcon() {
if (mUserIcon != null && mStoragePreference != null) {
mStoragePreference.setIcon(mUserIcon);
}
}
@VisibleForTesting
static class NoSecondaryUserController extends AbstractPreferenceController implements
PreferenceControllerMixin {
public NoSecondaryUserController(Context context) {
super(context);
}
@Override
public void displayPreference(PreferenceScreen screen) {
final PreferenceGroup group = screen.findPreference(TARGET_PREFERENCE_GROUP_KEY);
if (group == null) {
return;
}
screen.removePreference(group);
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return null;
}
}
}