Loading src/com/android/settings/Utils.java +0 −1 Original line number Diff line number Diff line Loading @@ -73,7 +73,6 @@ import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Profile; import android.provider.ContactsContract.RawContacts; import android.provider.Settings; import android.service.persistentdata.PersistentDataBlockManager; import android.support.annotation.StringRes; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; Loading src/com/android/settings/applications/UserManagerWrapper.java +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.settings.applications; import android.content.pm.UserInfo; import java.util.List; /** Loading src/com/android/settings/deviceinfo/StorageDashboardFragment.java +61 −28 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.app.LoaderManager; import android.content.Context; import android.content.Intent; import android.content.Loader; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; Loading Loading @@ -47,6 +48,7 @@ import com.android.settings.deviceinfo.storage.SecondaryUserController; import com.android.settings.deviceinfo.storage.StorageAsyncLoader; import com.android.settings.deviceinfo.storage.StorageItemPreferenceController; import com.android.settings.deviceinfo.storage.StorageSummaryDonutPreferenceController; import com.android.settings.deviceinfo.storage.UserIconLoader; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.applications.StorageStatsSource; Loading @@ -61,6 +63,7 @@ public class StorageDashboardFragment extends DashboardFragment implements LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> { private static final String TAG = "StorageDashboardFrag"; private static final int STORAGE_JOB_ID = 0; private static final int ICON_JOB_ID = 1; private static final int OPTIONS_MENU_MIGRATE_DATA = 100; private VolumeInfo mVolume; Loading @@ -70,34 +73,6 @@ public class StorageDashboardFragment extends DashboardFragment private PrivateVolumeOptionMenuController mOptionMenuController; private List<PreferenceController> mSecondaryUsers; @Override public void onResume() { super.onResume(); getLoaderManager().initLoader(STORAGE_JOB_ID, Bundle.EMPTY, this); } @Override public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id, Bundle args) { Context context = getContext(); return new StorageAsyncLoader(context, new UserManagerWrapperImpl(context.getSystemService(UserManager.class)), mVolume.fsUuid, new StorageStatsSource(context), new PackageManagerWrapperImpl(context.getPackageManager())); } @Override public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader, SparseArray<StorageAsyncLoader.AppsStorageResult> data) { mPreferenceController.onLoadFinished(data.get(UserHandle.myUserId())); updateSecondaryUserControllers(mSecondaryUsers, data); } @Override public void onLoaderReset(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader) { } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Loading Loading @@ -139,6 +114,13 @@ public class StorageDashboardFragment extends DashboardFragment } } @Override public void onResume() { super.onResume(); getLoaderManager().initLoader(STORAGE_JOB_ID, Bundle.EMPTY, this); getLoaderManager().initLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks()); } @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_STORAGE_CATEGORY; Loading Loading @@ -227,4 +209,55 @@ public class StorageDashboardFragment extends DashboardFragment } }; @Override public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id, Bundle args) { Context context = getContext(); return new StorageAsyncLoader(context, new UserManagerWrapperImpl(context.getSystemService(UserManager.class)), mVolume.fsUuid, new StorageStatsSource(context), new PackageManagerWrapperImpl(context.getPackageManager())); } @Override public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader, SparseArray<StorageAsyncLoader.AppsStorageResult> data) { mPreferenceController.onLoadFinished(data.get(UserHandle.myUserId())); updateSecondaryUserControllers(mSecondaryUsers, data); } @Override public void onLoaderReset(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader) { } /** * IconLoaderCallbacks exists because StorageDashboardFragment already implements * LoaderCallbacks for a different type. */ public final class IconLoaderCallbacks implements LoaderManager.LoaderCallbacks<SparseArray<Drawable>> { @Override public Loader<SparseArray<Drawable>> onCreateLoader(int id, Bundle args) { return new UserIconLoader( getContext(), () -> UserIconLoader.loadUserIconsWithContext(getContext())); } @Override public void onLoadFinished( Loader<SparseArray<Drawable>> loader, SparseArray<Drawable> data) { mSecondaryUsers .stream() .filter(controller -> controller instanceof UserIconLoader.UserIconHandler) .forEach( controller -> ((UserIconLoader.UserIconHandler) controller) .handleUserIcons(data)); } @Override public void onLoaderReset(Loader<SparseArray<Drawable>> loader) {} } } src/com/android/settings/deviceinfo/storage/SecondaryUserController.java +14 −6 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settings.deviceinfo.storage; import android.content.Context; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; Loading @@ -37,8 +38,8 @@ import java.util.List; * SecondaryUserController controls the preferences on the Storage screen which had to do with * secondary users. */ public class SecondaryUserController extends PreferenceController implements StorageAsyncLoader.ResultHandler { public class SecondaryUserController extends PreferenceController implements 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_"; Loading Loading @@ -69,8 +70,9 @@ public class SecondaryUserController extends PreferenceController implements } if (info == null || Utils.isProfileOf(primaryUser, info)) { controllers.add(new UserProfileController(context, info, USER_PROFILE_INSERTION_LOCATION)); controllers.add( new UserProfileController( context, info, userManager, USER_PROFILE_INSERTION_LOCATION)); continue; } Loading Loading @@ -109,8 +111,6 @@ public class SecondaryUserController extends PreferenceController implements mStoragePreference.setStorageSize(mSize, mTotalSizeBytes); } // TODO(b/36252572): Set the user icon appropriately here. group.setVisible(true); group.addPreference(mStoragePreference); } Loading Loading @@ -161,6 +161,14 @@ public class SecondaryUserController extends PreferenceController implements } } @Override public void handleUserIcons(SparseArray<Drawable> fetchedIcons) { Drawable userIcon = fetchedIcons.get(mUser.id); if (userIcon != null) { mStoragePreference.setIcon(userIcon); } } private static class NoSecondaryUserController extends PreferenceController { public NoSecondaryUserController(Context context) { super(context); Loading src/com/android/settings/deviceinfo/storage/UserIconLoader.java 0 → 100644 +75 −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.deviceinfo.storage; import android.content.Context; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.os.UserManager; import android.util.Log; import android.util.SparseArray; import com.android.internal.util.Preconditions; import com.android.settings.Utils; import com.android.settings.utils.AsyncLoader; /** * Fetches a user icon as a loader using a given icon loading lambda. */ public class UserIconLoader extends AsyncLoader<SparseArray<Drawable>> { private FetchUserIconTask mTask; /** * Task to load all user icons. */ public interface FetchUserIconTask { SparseArray<Drawable> getUserIcons(); } /** * Handle the output of this task. */ public interface UserIconHandler { void handleUserIcons(SparseArray<Drawable> fetchedIcons); } public UserIconLoader(Context context, FetchUserIconTask task) { super(context); mTask = Preconditions.checkNotNull(task); } @Override public SparseArray<Drawable> loadInBackground() { return mTask.getUserIcons(); } @Override protected void onDiscardResult(SparseArray<Drawable> result) {} /** * Loads the user icons using a given context. This returns a {@link SparseArray} which maps * user ids to their user icons. */ public static SparseArray<Drawable> loadUserIconsWithContext(Context context) { SparseArray<Drawable> value = new SparseArray<>(); UserManager um = context.getSystemService(UserManager.class); for (UserInfo userInfo : um.getUsers()) { value.put(userInfo.id, Utils.getUserIcon(context, um, userInfo)); } return value; } } Loading
src/com/android/settings/Utils.java +0 −1 Original line number Diff line number Diff line Loading @@ -73,7 +73,6 @@ import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Profile; import android.provider.ContactsContract.RawContacts; import android.provider.Settings; import android.service.persistentdata.PersistentDataBlockManager; import android.support.annotation.StringRes; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; Loading
src/com/android/settings/applications/UserManagerWrapper.java +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.settings.applications; import android.content.pm.UserInfo; import java.util.List; /** Loading
src/com/android/settings/deviceinfo/StorageDashboardFragment.java +61 −28 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.app.LoaderManager; import android.content.Context; import android.content.Intent; import android.content.Loader; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; Loading Loading @@ -47,6 +48,7 @@ import com.android.settings.deviceinfo.storage.SecondaryUserController; import com.android.settings.deviceinfo.storage.StorageAsyncLoader; import com.android.settings.deviceinfo.storage.StorageItemPreferenceController; import com.android.settings.deviceinfo.storage.StorageSummaryDonutPreferenceController; import com.android.settings.deviceinfo.storage.UserIconLoader; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.applications.StorageStatsSource; Loading @@ -61,6 +63,7 @@ public class StorageDashboardFragment extends DashboardFragment implements LoaderManager.LoaderCallbacks<SparseArray<StorageAsyncLoader.AppsStorageResult>> { private static final String TAG = "StorageDashboardFrag"; private static final int STORAGE_JOB_ID = 0; private static final int ICON_JOB_ID = 1; private static final int OPTIONS_MENU_MIGRATE_DATA = 100; private VolumeInfo mVolume; Loading @@ -70,34 +73,6 @@ public class StorageDashboardFragment extends DashboardFragment private PrivateVolumeOptionMenuController mOptionMenuController; private List<PreferenceController> mSecondaryUsers; @Override public void onResume() { super.onResume(); getLoaderManager().initLoader(STORAGE_JOB_ID, Bundle.EMPTY, this); } @Override public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id, Bundle args) { Context context = getContext(); return new StorageAsyncLoader(context, new UserManagerWrapperImpl(context.getSystemService(UserManager.class)), mVolume.fsUuid, new StorageStatsSource(context), new PackageManagerWrapperImpl(context.getPackageManager())); } @Override public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader, SparseArray<StorageAsyncLoader.AppsStorageResult> data) { mPreferenceController.onLoadFinished(data.get(UserHandle.myUserId())); updateSecondaryUserControllers(mSecondaryUsers, data); } @Override public void onLoaderReset(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader) { } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Loading Loading @@ -139,6 +114,13 @@ public class StorageDashboardFragment extends DashboardFragment } } @Override public void onResume() { super.onResume(); getLoaderManager().initLoader(STORAGE_JOB_ID, Bundle.EMPTY, this); getLoaderManager().initLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks()); } @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.SETTINGS_STORAGE_CATEGORY; Loading Loading @@ -227,4 +209,55 @@ public class StorageDashboardFragment extends DashboardFragment } }; @Override public Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> onCreateLoader(int id, Bundle args) { Context context = getContext(); return new StorageAsyncLoader(context, new UserManagerWrapperImpl(context.getSystemService(UserManager.class)), mVolume.fsUuid, new StorageStatsSource(context), new PackageManagerWrapperImpl(context.getPackageManager())); } @Override public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader, SparseArray<StorageAsyncLoader.AppsStorageResult> data) { mPreferenceController.onLoadFinished(data.get(UserHandle.myUserId())); updateSecondaryUserControllers(mSecondaryUsers, data); } @Override public void onLoaderReset(Loader<SparseArray<StorageAsyncLoader.AppsStorageResult>> loader) { } /** * IconLoaderCallbacks exists because StorageDashboardFragment already implements * LoaderCallbacks for a different type. */ public final class IconLoaderCallbacks implements LoaderManager.LoaderCallbacks<SparseArray<Drawable>> { @Override public Loader<SparseArray<Drawable>> onCreateLoader(int id, Bundle args) { return new UserIconLoader( getContext(), () -> UserIconLoader.loadUserIconsWithContext(getContext())); } @Override public void onLoadFinished( Loader<SparseArray<Drawable>> loader, SparseArray<Drawable> data) { mSecondaryUsers .stream() .filter(controller -> controller instanceof UserIconLoader.UserIconHandler) .forEach( controller -> ((UserIconLoader.UserIconHandler) controller) .handleUserIcons(data)); } @Override public void onLoaderReset(Loader<SparseArray<Drawable>> loader) {} } }
src/com/android/settings/deviceinfo/storage/SecondaryUserController.java +14 −6 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settings.deviceinfo.storage; import android.content.Context; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; Loading @@ -37,8 +38,8 @@ import java.util.List; * SecondaryUserController controls the preferences on the Storage screen which had to do with * secondary users. */ public class SecondaryUserController extends PreferenceController implements StorageAsyncLoader.ResultHandler { public class SecondaryUserController extends PreferenceController implements 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_"; Loading Loading @@ -69,8 +70,9 @@ public class SecondaryUserController extends PreferenceController implements } if (info == null || Utils.isProfileOf(primaryUser, info)) { controllers.add(new UserProfileController(context, info, USER_PROFILE_INSERTION_LOCATION)); controllers.add( new UserProfileController( context, info, userManager, USER_PROFILE_INSERTION_LOCATION)); continue; } Loading Loading @@ -109,8 +111,6 @@ public class SecondaryUserController extends PreferenceController implements mStoragePreference.setStorageSize(mSize, mTotalSizeBytes); } // TODO(b/36252572): Set the user icon appropriately here. group.setVisible(true); group.addPreference(mStoragePreference); } Loading Loading @@ -161,6 +161,14 @@ public class SecondaryUserController extends PreferenceController implements } } @Override public void handleUserIcons(SparseArray<Drawable> fetchedIcons) { Drawable userIcon = fetchedIcons.get(mUser.id); if (userIcon != null) { mStoragePreference.setIcon(userIcon); } } private static class NoSecondaryUserController extends PreferenceController { public NoSecondaryUserController(Context context) { super(context); Loading
src/com/android/settings/deviceinfo/storage/UserIconLoader.java 0 → 100644 +75 −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.deviceinfo.storage; import android.content.Context; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.os.UserManager; import android.util.Log; import android.util.SparseArray; import com.android.internal.util.Preconditions; import com.android.settings.Utils; import com.android.settings.utils.AsyncLoader; /** * Fetches a user icon as a loader using a given icon loading lambda. */ public class UserIconLoader extends AsyncLoader<SparseArray<Drawable>> { private FetchUserIconTask mTask; /** * Task to load all user icons. */ public interface FetchUserIconTask { SparseArray<Drawable> getUserIcons(); } /** * Handle the output of this task. */ public interface UserIconHandler { void handleUserIcons(SparseArray<Drawable> fetchedIcons); } public UserIconLoader(Context context, FetchUserIconTask task) { super(context); mTask = Preconditions.checkNotNull(task); } @Override public SparseArray<Drawable> loadInBackground() { return mTask.getUserIcons(); } @Override protected void onDiscardResult(SparseArray<Drawable> result) {} /** * Loads the user icons using a given context. This returns a {@link SparseArray} which maps * user ids to their user icons. */ public static SparseArray<Drawable> loadUserIconsWithContext(Context context) { SparseArray<Drawable> value = new SparseArray<>(); UserManager um = context.getSystemService(UserManager.class); for (UserInfo userInfo : um.getUsers()) { value.put(userInfo.id, Utils.getUserIcon(context, um, userInfo)); } return value; } }