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