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; 272a55a49f5a2d3f102c11f822c76f190a00249d50Tony Mantlerimport android.support.v17.leanback.app.GuidedStepFragment; 2880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.support.v17.leanback.widget.GuidanceStylist; 2980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.support.v17.leanback.widget.GuidedAction; 3080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.text.TextUtils; 3180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport android.util.ArrayMap; 3280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 33fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport com.android.settingslib.applications.ApplicationsState; 3480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport com.android.tv.settings.R; 3580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport com.android.tv.settings.device.apps.AppInfo; 36754ccda2d59a46be682bee0e2c6633f20b6c3fb3Tony Mantlerimport com.android.tv.settings.device.apps.MoveAppActivity; 3780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 3880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport java.util.ArrayList; 3980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport java.util.List; 4080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantlerimport java.util.Map; 4180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 422a55a49f5a2d3f102c11f822c76f190a00249d50Tony Mantlerpublic class BackupAppsStepFragment extends GuidedStepFragment implements 4380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler ApplicationsState.Callbacks { 4480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 45188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler private static final int ACTION_NO_APPS = 0; 46188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler private static final int ACTION_MIGRATE_DATA = 1; 47188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler private static final int ACTION_BACKUP_APP_BASE = 100; 48188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler 4980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private ApplicationsState mApplicationsState; 5080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private ApplicationsState.Session mSession; 5180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 5280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private PackageManager mPackageManager; 5380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private StorageManager mStorageManager; 5480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 55631c8b1605589e6935f429b87d640aeba03999ccTony Mantler private String mVolumeId; 56860abce9664c5403d7401fd81a51574355f35070Tony Mantler private ApplicationsState.AppFilter mAppFilter; 57631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 5880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private IconLoaderTask mIconLoaderTask; 5980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private final Map<String, Drawable> mIconMap = new ArrayMap<>(); 6080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 61860abce9664c5403d7401fd81a51574355f35070Tony Mantler private final List<ApplicationsState.AppEntry> mEntries = new ArrayList<>(); 62631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 63fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public static BackupAppsStepFragment newInstance(String volumeId) { 6480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final BackupAppsStepFragment fragment = new BackupAppsStepFragment(); 6580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final Bundle b = new Bundle(1); 66fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler b.putString(VolumeInfo.EXTRA_VOLUME_ID, volumeId); 6780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler fragment.setArguments(b); 6880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return fragment; 6980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 7080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 7180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 7280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onCreate(Bundle savedInstanceState) { 7380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler // Need mPackageManager before onCreateActions, which is called from super.onCreate 7480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mPackageManager = getActivity().getPackageManager(); 7580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mStorageManager = getActivity().getSystemService(StorageManager.class); 7680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 77631c8b1605589e6935f429b87d640aeba03999ccTony Mantler mVolumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID); 78860abce9664c5403d7401fd81a51574355f35070Tony Mantler final VolumeInfo info = mStorageManager.findVolumeById(mVolumeId); 79860abce9664c5403d7401fd81a51574355f35070Tony Mantler if (info != null) { 80860abce9664c5403d7401fd81a51574355f35070Tony Mantler mAppFilter = new ApplicationsState.VolumeFilter(info.getFsUuid()); 81860abce9664c5403d7401fd81a51574355f35070Tony Mantler } else { 82188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (!getFragmentManager().popBackStackImmediate()) { 83188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler getActivity().finish(); 84188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 85860abce9664c5403d7401fd81a51574355f35070Tony Mantler mAppFilter = new ApplicationsState.AppFilter() { 86860abce9664c5403d7401fd81a51574355f35070Tony Mantler @Override 87860abce9664c5403d7401fd81a51574355f35070Tony Mantler public void init() {} 88860abce9664c5403d7401fd81a51574355f35070Tony Mantler 89860abce9664c5403d7401fd81a51574355f35070Tony Mantler @Override 90860abce9664c5403d7401fd81a51574355f35070Tony Mantler public boolean filterApp(ApplicationsState.AppEntry info) { 91860abce9664c5403d7401fd81a51574355f35070Tony Mantler return false; 92860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 93860abce9664c5403d7401fd81a51574355f35070Tony Mantler }; 94860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 95631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 9680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication()); 9780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mSession = mApplicationsState.newSession(this); 9880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 9980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler super.onCreate(savedInstanceState); 10080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 10180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 10280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 10380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onResume() { 10480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler super.onResume(); 10580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mSession.resume(); 106860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 10780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 10880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 10980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 11080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPause() { 11180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler super.onPause(); 11280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mSession.pause(); 11380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 11480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 11580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 11680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public @NonNull GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 11780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final String title; 118631c8b1605589e6935f429b87d640aeba03999ccTony Mantler final VolumeInfo volumeInfo = mStorageManager.findVolumeById(mVolumeId); 11980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final String volumeDesc = mStorageManager.getBestVolumeDescription(volumeInfo); 12080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final String primaryStorageVolumeId = 12180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mPackageManager.getPrimaryStorageCurrentVolume().getId(); 12280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler if (TextUtils.equals(primaryStorageVolumeId, volumeInfo.getId())) { 12380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler title = getString(R.string.storage_wizard_back_up_apps_and_data_title, volumeDesc); 12480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } else { 12580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler title = getString(R.string.storage_wizard_back_up_apps_title, volumeDesc); 12680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 12780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return new GuidanceStylist.Guidance( 12880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler title, 12980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler "", 13080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler "", 1318f472252a02517b065b5de166135a50e93d4b425Tony Mantler getActivity().getDrawable(R.drawable.ic_storage_132dp)); 13280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 13380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 13480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 13580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) { 136860abce9664c5403d7401fd81a51574355f35070Tony Mantler final List<ApplicationsState.AppEntry> entries = mSession.rebuild(mAppFilter, 137860abce9664c5403d7401fd81a51574355f35070Tony Mantler ApplicationsState.ALPHA_COMPARATOR); 138860abce9664c5403d7401fd81a51574355f35070Tony Mantler if (entries != null) { 139860abce9664c5403d7401fd81a51574355f35070Tony Mantler actions.addAll(getAppActions(true, entries)); 140860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 14180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 14280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 143860abce9664c5403d7401fd81a51574355f35070Tony Mantler private List<GuidedAction> getAppActions(boolean refreshIcons, 144860abce9664c5403d7401fd81a51574355f35070Tony Mantler List<ApplicationsState.AppEntry> entries) { 14580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 146188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler final List<GuidedAction> actions = new ArrayList<>(entries.size() + 1); 147188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler 148188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler boolean showMigrate = false; 149188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler final VolumeInfo currentExternal = mPackageManager.getPrimaryStorageCurrentVolume(); 150188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler // currentExternal will be null if the drive is not mounted. Don't offer the option to 151188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler // migrate if so. 152188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (currentExternal != null 153188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler && TextUtils.equals(currentExternal.getId(), mVolumeId)) { 154188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler final List<VolumeInfo> candidates = 155188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler mPackageManager.getPrimaryStorageCandidateVolumes(); 156188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler for (final VolumeInfo candidate : candidates) { 157188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (!TextUtils.equals(candidate.getId(), mVolumeId)) { 158188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler showMigrate = true; 159188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler break; 160188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 161188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 162188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 163188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler 164188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (showMigrate) { 165188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler actions.add(new GuidedAction.Builder(getContext()) 166188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .id(ACTION_MIGRATE_DATA) 167188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .title(R.string.storage_migrate_away) 168188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .build()); 169188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 170188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler 171188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler int index = ACTION_BACKUP_APP_BASE; 172860abce9664c5403d7401fd81a51574355f35070Tony Mantler for (final ApplicationsState.AppEntry entry : entries) { 173860abce9664c5403d7401fd81a51574355f35070Tony Mantler final ApplicationInfo info = entry.info; 17480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler final AppInfo appInfo = new AppInfo(getActivity(), entry); 1752a55a49f5a2d3f102c11f822c76f190a00249d50Tony Mantler actions.add(new GuidedAction.Builder(getContext()) 17680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .title(appInfo.getName()) 17780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .description(appInfo.getSize()) 17880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .icon(mIconMap.get(info.packageName)) 179188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .id(index++) 18080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler .build()); 18180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 182860abce9664c5403d7401fd81a51574355f35070Tony Mantler mEntries.clear(); 183860abce9664c5403d7401fd81a51574355f35070Tony Mantler mEntries.addAll(entries); 184631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 18580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler if (refreshIcons) { 18680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler if (mIconLoaderTask != null) { 18780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconLoaderTask.cancel(true); 18880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 189860abce9664c5403d7401fd81a51574355f35070Tony Mantler mIconLoaderTask = new IconLoaderTask(entries); 19080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconLoaderTask.execute(); 19180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 192188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler 193188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (actions.size() == 0) { 194188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler actions.add(new GuidedAction.Builder(getContext()) 195188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .id(ACTION_NO_APPS) 196188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .title(R.string.storage_no_apps) 197188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler .build()); 198188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 19980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return actions; 20080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 20180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 20280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private void updateActions() { 203860abce9664c5403d7401fd81a51574355f35070Tony Mantler final List<ApplicationsState.AppEntry> entries = mSession.rebuild(mAppFilter, 204860abce9664c5403d7401fd81a51574355f35070Tony Mantler ApplicationsState.ALPHA_COMPARATOR); 205860abce9664c5403d7401fd81a51574355f35070Tony Mantler if (entries != null) { 206860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(true, entries)); 207860abce9664c5403d7401fd81a51574355f35070Tony Mantler } else { 208860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(true, mEntries)); 209860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 21080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 21180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 21280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 21380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onGuidedActionClicked(GuidedAction action) { 214631c8b1605589e6935f429b87d640aeba03999ccTony Mantler final int actionId = (int) action.getId(); 215188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (actionId == ACTION_MIGRATE_DATA) { 216188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler startActivity(MigrateStorageActivity.getLaunchIntent(getActivity(), mVolumeId, false)); 217188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } else if (actionId == ACTION_NO_APPS) { 218188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler if (!getFragmentManager().popBackStackImmediate()) { 219188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler getActivity().finish(); 220188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 221188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } else if (actionId >= ACTION_BACKUP_APP_BASE 222188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler && actionId < mEntries.size() + ACTION_BACKUP_APP_BASE) { 223188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler final ApplicationsState.AppEntry entry = 224188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler mEntries.get(actionId - ACTION_BACKUP_APP_BASE); 225188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler final AppInfo appInfo = new AppInfo(getActivity(), entry); 226631c8b1605589e6935f429b87d640aeba03999ccTony Mantler 227188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler startActivity(MoveAppActivity.getLaunchIntent(getActivity(), entry.info.packageName, 228188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler appInfo.getName())); 229188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } else { 230188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler throw new IllegalArgumentException("Unknown action " + action); 231188b9ba6bde5e72fae6c0698be490f20b86af95fTony Mantler } 23280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 23380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 23480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 235860abce9664c5403d7401fd81a51574355f35070Tony Mantler public void onRunningStateChanged(boolean running) { 236860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 237860abce9664c5403d7401fd81a51574355f35070Tony Mantler } 23880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 23980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 24080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPackageListChanged() { 24180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 24280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 24380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 24480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 2455762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler public void onRebuildComplete(ArrayList<ApplicationsState.AppEntry> apps) { 246860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(true, apps)); 2475762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler } 2485762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler 2495762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler @Override 2505762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler public void onLauncherInfoChanged() { 251860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 2525762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler } 2535762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler 2545762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler @Override 2555762c1a616c21c4cb294fce54ed7c9ab001b6e7cTony Mantler public void onLoadEntriesCompleted() { 256860abce9664c5403d7401fd81a51574355f35070Tony Mantler updateActions(); 25780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 25880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 25980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 26080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPackageIconChanged() { 26180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 26280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 26380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 26480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 26580af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onPackageSizeChanged(String packageName) { 26680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 26780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 26880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 26980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 27080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler public void onAllSizesComputed() { 27180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler updateActions(); 27280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 27380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 27480af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler private class IconLoaderTask extends AsyncTask<Void, Void, Map<String, Drawable>> { 275860abce9664c5403d7401fd81a51574355f35070Tony Mantler private final List<ApplicationsState.AppEntry> mEntries; 27680af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 277860abce9664c5403d7401fd81a51574355f35070Tony Mantler public IconLoaderTask(List<ApplicationsState.AppEntry> entries) { 278860abce9664c5403d7401fd81a51574355f35070Tony Mantler mEntries = entries; 27980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 28080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 28180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 28280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler protected Map<String, Drawable> doInBackground(Void... params) { 28380af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler // NB: Java doesn't like parameterized generics in varargs 284860abce9664c5403d7401fd81a51574355f35070Tony Mantler final Map<String, Drawable> result = new ArrayMap<>(mEntries.size()); 285860abce9664c5403d7401fd81a51574355f35070Tony Mantler for (final ApplicationsState.AppEntry entry : mEntries) { 286860abce9664c5403d7401fd81a51574355f35070Tony Mantler result.put(entry.info.packageName, mPackageManager.getApplicationIcon(entry.info)); 28780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 28880af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler return result; 28980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 29080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 29180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler @Override 29280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler protected void onPostExecute(Map<String, Drawable> stringDrawableMap) { 29308c79862ffe79b9f19b72ce66bf3970c1ab8f9b4Tony Mantler mIconLoaderTask = null; 29408c79862ffe79b9f19b72ce66bf3970c1ab8f9b4Tony Mantler if (!isAdded()) { 29508c79862ffe79b9f19b72ce66bf3970c1ab8f9b4Tony Mantler return; 29608c79862ffe79b9f19b72ce66bf3970c1ab8f9b4Tony Mantler } 29780af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler mIconMap.putAll(stringDrawableMap); 298860abce9664c5403d7401fd81a51574355f35070Tony Mantler setActions(getAppActions(false, mEntries)); 29980af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 30080af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler } 30180af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler 30280af6ad8caf35ff81d9e031591492fd11728afdbTony Mantler} 303