180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler/* 280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * Copyright (C) 2015 The Android Open Source Project 380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * 480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * you may not use this file except in compliance with the License. 680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * You may obtain a copy of the License at 780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * 880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * http://www.apache.org/licenses/LICENSE-2.0 980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * 1080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * Unless required by applicable law or agreed to in writing, software 1180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 1280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * See the License for the specific language governing permissions and 1480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler * limitations under the License 1580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler */ 1680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 1780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerpackage com.android.tv.settings.device.storage; 1880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 1980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.content.pm.ApplicationInfo; 2080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.content.pm.PackageManager; 2180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.graphics.drawable.Drawable; 2280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.os.AsyncTask; 2380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.os.Bundle; 2480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.os.storage.StorageManager; 2580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.os.storage.VolumeInfo; 2680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.support.annotation.NonNull; 2780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.support.v17.leanback.widget.GuidanceStylist; 2880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.support.v17.leanback.widget.GuidedAction; 2980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.text.TextUtils; 3080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.util.ArrayMap; 3180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 32fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport com.android.settingslib.applications.ApplicationsState; 3380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport com.android.tv.settings.R; 3480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport com.android.tv.settings.device.apps.AppInfo; 3580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 3680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport java.util.ArrayList; 3780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport java.util.List; 3880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport java.util.Map; 3980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 40f75ca4adb775442408593a3e15606c5492434ee3Tony Mantlerpublic class BackupAppsStepFragment extends StorageGuidedStepFragment implements 4180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler ApplicationsState.Callbacks { 4280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 4380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private static final String TAG = "BackupAppsStepFragment"; 4480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 4580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private ApplicationsState mApplicationsState; 4680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private ApplicationsState.Session mSession; 4780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 4880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private PackageManager mPackageManager; 4980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private StorageManager mStorageManager; 5080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 51631c8b1605589e6935f429b87d640aeba03999ccTony Mantler private String mVolumeId; 52860abce9664c5403d7401fd81a51574355f35070Tony Mantler private ApplicationsState.AppFilter mAppFilter; 53631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 5480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private IconLoaderTask mIconLoaderTask; 5580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private final Map<String, Drawable> mIconMap = new ArrayMap<>(); 5680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 57860abce9664c5403d7401fd81a51574355f35070Tony Mantler private final List<ApplicationsState.AppEntry> mEntries = new ArrayList<>(); 58631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 59fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public static BackupAppsStepFragment newInstance(String volumeId) { 6080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final BackupAppsStepFragment fragment = new BackupAppsStepFragment(); 6180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final Bundle b = new Bundle(1); 62fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler b.putString(VolumeInfo.EXTRA_VOLUME_ID, volumeId); 6380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler fragment.setArguments(b); 6480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return fragment; 6580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 6680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 6780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 6880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onCreate(Bundle savedInstanceState) { 6980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler // Need mPackageManager before onCreateActions, which is called from super.onCreate 7080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mPackageManager = getActivity().getPackageManager(); 7180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mStorageManager = getActivity().getSystemService(StorageManager.class); 7280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 73631c8b1605589e6935f429b87d640aeba03999ccTony Mantler mVolumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID); 74860abce9664c5403d7401fd81a51574355f35070Tony Mantler final VolumeInfo info = mStorageManager.findVolumeById(mVolumeId); 75860abce9664c5403d7401fd81a51574355f35070Tony Mantler if (info != null) { 76860abce9664c5403d7401fd81a51574355f35070Tony Mantler mAppFilter = new ApplicationsState.VolumeFilter(info.getFsUuid()); 77860abce9664c5403d7401fd81a51574355f35070Tony Mantler } else { 78860abce9664c5403d7401fd81a51574355f35070Tony Mantler // TODO: bail out somehow 79860abce9664c5403d7401fd81a51574355f35070Tony Mantler mAppFilter = new ApplicationsState.AppFilter() { 80860abce9664c5403d7401fd81a51574355f35070Tony Mantler @Override 81860abce9664c5403d7401fd81a51574355f35070Tony Mantler public void init() {} 82860abce9664c5403d7401fd81a51574355f35070Tony Mantler 83860abce9664c5403d7401fd81a51574355f35070Tony Mantler @Override 84860abce9664c5403d7401fd81a51574355f35070Tony Mantler public boolean filterApp(ApplicationsState.AppEntry info) { 85860abce9664c5403d7401fd81a51574355f35070Tony Mantler return false; 86860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 87860abce9664c5403d7401fd81a51574355f35070Tony Mantler }; 88860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 89631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 9080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 9180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mSession = mApplicationsState.newSession(this); 9280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 9380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler super.onCreate(savedInstanceState); 9480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 9580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 9680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 9780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onResume() { 9880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler super.onResume(); 9980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mSession.resume(); 100860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 10180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 10280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 10380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 10480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPause() { 10580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler super.onPause(); 10680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mSession.pause(); 10780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 10880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 10980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 11080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public @NonNull GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 11180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final String title; 112631c8b1605589e6935f429b87d640aeba03999ccTony Mantler final VolumeInfo volumeInfo = mStorageManager.findVolumeById(mVolumeId); 11380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final String volumeDesc = mStorageManager.getBestVolumeDescription(volumeInfo); 11480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final String primaryStorageVolumeId = 11580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mPackageManager.getPrimaryStorageCurrentVolume().getId(); 11680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler if (TextUtils.equals(primaryStorageVolumeId, volumeInfo.getId())) { 11780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler title = getString(R.string.storage_wizard_back_up_apps_and_data_title, volumeDesc); 11880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } else { 11980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler title = getString(R.string.storage_wizard_back_up_apps_title, volumeDesc); 12080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 12180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return new GuidanceStylist.Guidance( 12280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler title, 12380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler "", 12480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler "", 12580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler getActivity().getDrawable(R.drawable.ic_settings_storage)); 12680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 12780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 12880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 12980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) { 130860abce9664c5403d7401fd81a51574355f35070Tony Mantler final List<ApplicationsState.AppEntry> entries = mSession.rebuild(mAppFilter, 131860abce9664c5403d7401fd81a51574355f35070Tony Mantler ApplicationsState.ALPHA_COMPARATOR); 132860abce9664c5403d7401fd81a51574355f35070Tony Mantler if (entries != null) { 133860abce9664c5403d7401fd81a51574355f35070Tony Mantler actions.addAll(getAppActions(true, entries)); 134860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 13580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 13680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 137860abce9664c5403d7401fd81a51574355f35070Tony Mantler private List<GuidedAction> getAppActions(boolean refreshIcons, 138860abce9664c5403d7401fd81a51574355f35070Tony Mantler List<ApplicationsState.AppEntry> entries) { 13980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 140860abce9664c5403d7401fd81a51574355f35070Tony Mantler final List<GuidedAction> actions = new ArrayList<>(entries.size()); 141860abce9664c5403d7401fd81a51574355f35070Tony Mantler for (final ApplicationsState.AppEntry entry : entries) { 142860abce9664c5403d7401fd81a51574355f35070Tony Mantler final int index = actions.size(); 143860abce9664c5403d7401fd81a51574355f35070Tony Mantler final ApplicationInfo info = entry.info; 14480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final AppInfo appInfo = new AppInfo(getActivity(), entry); 14580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler actions.add(new GuidedAction.Builder() 14680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .title(appInfo.getName()) 14780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .description(appInfo.getSize()) 14880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .icon(mIconMap.get(info.packageName)) 149631c8b1605589e6935f429b87d640aeba03999ccTony Mantler .id(index) 15080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .build()); 15180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 152860abce9664c5403d7401fd81a51574355f35070Tony Mantler mEntries.clear(); 153860abce9664c5403d7401fd81a51574355f35070Tony Mantler mEntries.addAll(entries); 154631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 15580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler if (refreshIcons) { 15680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler if (mIconLoaderTask != null) { 15780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconLoaderTask.cancel(true); 15880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 159860abce9664c5403d7401fd81a51574355f35070Tony Mantler mIconLoaderTask = new IconLoaderTask(entries); 16080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconLoaderTask.execute(); 16180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 16280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return actions; 16380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 16480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 16580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private void updateActions() { 166860abce9664c5403d7401fd81a51574355f35070Tony Mantler final List<ApplicationsState.AppEntry> entries = mSession.rebuild(mAppFilter, 167860abce9664c5403d7401fd81a51574355f35070Tony Mantler ApplicationsState.ALPHA_COMPARATOR); 168860abce9664c5403d7401fd81a51574355f35070Tony Mantler if (entries != null) { 169860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(true, entries)); 170860abce9664c5403d7401fd81a51574355f35070Tony Mantler } else { 171860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(true, mEntries)); 172860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 17380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 17480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 17580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 17680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onGuidedActionClicked(GuidedAction action) { 177631c8b1605589e6935f429b87d640aeba03999ccTony Mantler final int actionId = (int) action.getId(); 178860abce9664c5403d7401fd81a51574355f35070Tony Mantler final ApplicationsState.AppEntry entry = mEntries.get(actionId); 179860abce9664c5403d7401fd81a51574355f35070Tony Mantler final AppInfo appInfo = new AppInfo(getActivity(), entry); 180631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 181860abce9664c5403d7401fd81a51574355f35070Tony Mantler final MoveAppStepFragment fragment = MoveAppStepFragment.newInstance(entry.info.packageName, 182631c8b1605589e6935f429b87d640aeba03999ccTony Mantler appInfo.getName()); 183631c8b1605589e6935f429b87d640aeba03999ccTony Mantler getFragmentManager().beginTransaction() 184631c8b1605589e6935f429b87d640aeba03999ccTony Mantler .addToBackStack(null) 185631c8b1605589e6935f429b87d640aeba03999ccTony Mantler .replace(android.R.id.content, fragment) 186631c8b1605589e6935f429b87d640aeba03999ccTony Mantler .commit(); 18780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 18880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 18980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 190860abce9664c5403d7401fd81a51574355f35070Tony Mantler public void onRunningStateChanged(boolean running) { 191860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 192860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 19380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 19480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 19580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPackageListChanged() { 19680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 19780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 19880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 19980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 2005762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) { 201860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(true, apps)); 2025762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler } 2035762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler 2045762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler @Override 2055762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler public void onLauncherInfoChanged() { 206860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 2075762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler } 2085762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler 2095762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler @Override 2105762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler public void onLoadEntriesCompleted() { 211860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 21280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 21380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 21480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 21580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPackageIconChanged() { 21680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 21780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 21880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 21980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 22080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPackageSizeChanged(String packageName) { 22180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 22280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 22380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 22480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 22580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onAllSizesComputed() { 22680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 22780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 22880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 22980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private class IconLoaderTask extends AsyncTask<Void, Void, Map<String, Drawable>> { 230860abce9664c5403d7401fd81a51574355f35070Tony Mantler private final List<ApplicationsState.AppEntry> mEntries; 23180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 232860abce9664c5403d7401fd81a51574355f35070Tony Mantler public IconLoaderTask(List<ApplicationsState.AppEntry> entries) { 233860abce9664c5403d7401fd81a51574355f35070Tony Mantler mEntries = entries; 23480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 23580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 23680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 23780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler protected Map<String, Drawable> doInBackground(Void... params) { 23880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler // NB: Java doesn't like parameterized generics in varargs 239860abce9664c5403d7401fd81a51574355f35070Tony Mantler final Map<String, Drawable> result = new ArrayMap<>(mEntries.size()); 240860abce9664c5403d7401fd81a51574355f35070Tony Mantler for (final ApplicationsState.AppEntry entry : mEntries) { 241860abce9664c5403d7401fd81a51574355f35070Tony Mantler result.put(entry.info.packageName, mPackageManager.getApplicationIcon(entry.info)); 24280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 24380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return result; 24480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 24580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 24680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 24780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler protected void onPostExecute(Map<String, Drawable> stringDrawableMap) { 24880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconMap.putAll(stringDrawableMap); 249860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(false, mEntries)); 25080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconLoaderTask = null; 25180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 25280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 25380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 25480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler} 255