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