Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dfed8a2a authored by Daniel Nishi's avatar Daniel Nishi
Browse files

Add support for visualizing secondary users.

This functionality adds the secondary users to the screen, but
currently does not populate the information for them. Once the
external stats query works, I will add a loader which will
populate this information.

This also does not cover work profiles. Support for that is
forthcoming.

Bug: 34715777, 34225103
Test: Settings Robotest
Change-Id: Ib9b692b214f5ce5d303dfd64516381443d4acebd
parent aba2c95a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@
        android:key="pref_system"
        android:title="@string/storage_detail_system">
    </com.android.settings.deviceinfo.storage.StorageItemPreferenceAlternate>
    <PreferenceCategory
        android:key="pref_secondary_users"
        android:title="@string/storage_other_users" />
    <Preference
        android:key="manage_storage"
        android:title="@string/storage_menu_manage"
+12 −0
Original line number Diff line number Diff line
@@ -1246,4 +1246,16 @@ public final class Utils extends com.android.settingslib.Utils {
                && (Settings.Secure.getInt(context.getContentResolver(),
                        carrierDemoModeSetting, 0) == 1);
    }

    /**
     * Returns if a given user is a profile of another user.
     * @param user The user whose profiles will be checked.
     * @param profile The (potential) profile.
     * @return if the profile is actually a profile
     */
    public static boolean isProfileOf(UserInfo user, UserInfo profile) {
        return user.id == profile.id ||
                (user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
                        && user.profileGroupId == profile.profileGroupId);
    }
}
+32 −0
Original line number Diff line number Diff line
/*
 * 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.applications;

import android.content.pm.UserInfo;

import java.util.List;

/**
 * This interface replicates a subset of the android.os.UserManager. The interface
 * exists so that we can use a thin wrapper around the UserManager in production code and a mock in
 * tests. We cannot directly mock or shadow the UserManager, because some of the methods we rely on
 * are newer than the API version supported by Robolectric or are hidden.
 */
public interface UserManagerWrapper {
    UserInfo getPrimaryUser();
    List<UserInfo> getUsers();
}
+40 −0
Original line number Diff line number Diff line
/*
 * 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.applications;

import android.content.pm.UserInfo;
import android.os.UserManager;

import java.util.List;

public class UserManagerWrapperImpl implements UserManagerWrapper {
    private UserManager mUserManager;

    public UserManagerWrapperImpl(UserManager userManager) {
        mUserManager = userManager;
    }

    @Override
    public UserInfo getPrimaryUser() {
        return mUserManager.getPrimaryUser();
    }

    @Override
    public List<UserInfo> getUsers() {
        return mUserManager.getUsers();
    }
}
+2 −8
Original line number Diff line number Diff line
@@ -228,7 +228,7 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
        // Add current user and its profiles first
        for (int userIndex = 0; userIndex < userCount; ++userIndex) {
            final UserInfo userInfo = allUsers.get(userIndex);
            if (isProfileOf(mCurrentUser, userInfo)) {
            if (Utils.isProfileOf(mCurrentUser, userInfo)) {
                final PreferenceGroup details = showHeaders ?
                        addCategory(screen, userInfo.name) : screen;
                addDetailItems(details, showShared, userInfo.id);
@@ -242,7 +242,7 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
                    getText(R.string.storage_other_users));
            for (int userIndex = 0; userIndex < userCount; ++userIndex) {
                final UserInfo userInfo = allUsers.get(userIndex);
                if (!isProfileOf(mCurrentUser, userInfo)) {
                if (!Utils.isProfileOf(mCurrentUser, userInfo)) {
                    addItem(otherUsers, /* titleRes */ 0, userInfo.name, userInfo.id);
                }
            }
@@ -649,12 +649,6 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
        pref.setStorageSize(size, mTotalSize);
    }

    private boolean isProfileOf(UserInfo user, UserInfo profile) {
        return user.id == profile.id ||
                (user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
                && user.profileGroupId == profile.profileGroupId);
    }

    private static long totalValues(MeasurementDetails details, int userId, String... keys) {
        long total = 0;
        HashMap<String, Long> map = details.mediaSize.get(userId);
Loading