AppInfo.java revision 325dc23624160689e59fbac708cf6f222b20d025
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ComponentName;
2031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Intent;
213d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroyimport android.content.pm.PackageManager;
223d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroyimport android.content.pm.PackageManager.NameNotFoundException;
23c3eecff9043759926df124483b45fe8f4436ae7cWinson Chungimport android.content.pm.ResolveInfo;
2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.Bitmap;
25be38609f875f9b9374ceaf723135c0a624637fcbJoe Onoratoimport android.util.Log;
26be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato
273d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroyimport java.util.ArrayList;
28c3eecff9043759926df124483b45fe8f4436ae7cWinson Chungimport java.util.HashMap;
293d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
310589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato * Represents an app in AllAppsView.
3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectclass ApplicationInfo extends ItemInfo {
343d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy    private static final String TAG = "Launcher2.ApplicationInfo";
3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * The intent used to start the application.
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    Intent intent;
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * A bitmap version of the application icon.
439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    Bitmap iconBitmap;
459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
4678403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung    /**
4778403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung     * The time at which the app was first installed.
4878403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung     */
4978403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung    long firstInstallTime;
5078403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung
510589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    ComponentName componentName;
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
53cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy    static final int DOWNLOADED_FLAG = 1;
54cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy    static final int UPDATED_SYSTEM_APP_FLAG = 2;
55cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy
563d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy    int flags = 0;
570589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
58c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka    ApplicationInfo() {
590589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_SHORTCUT;
600589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
630589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato     * Must not hold the Context.
6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
65c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung    public ApplicationInfo(PackageManager pm, ResolveInfo info, IconCache iconCache,
66c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka            HashMap<Object, CharSequence> labelCache) {
673d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        final String packageName = info.activityInfo.applicationInfo.packageName;
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
693d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        this.componentName = new ComponentName(packageName, info.activityInfo.name);
700589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        this.container = ItemInfo.NO_ID;
710589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        this.setActivity(componentName,
720589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato                Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
730589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
743d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        try {
753d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            int appFlags = pm.getApplicationInfo(packageName, 0).flags;
763d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
773d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy                flags |= DOWNLOADED_FLAG;
783d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy
79cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy                if ((appFlags & android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
80cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy                    flags |= UPDATED_SYSTEM_APP_FLAG;
81cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy                }
823d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            }
83cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy            firstInstallTime = pm.getPackageInfo(packageName, 0).firstInstallTime;
843d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        } catch (NameNotFoundException e) {
853d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            Log.d(TAG, "PackageManager.getApplicationInfo failed for " + packageName);
863d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        }
873d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy
88c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung        iconCache.getTitleAndIcon(this, info, labelCache);
8931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
90c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung
91c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka    public ApplicationInfo(ApplicationInfo info) {
92c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka        super(info);
930589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        componentName = info.componentName;
9431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        title = info.title.toString();
9531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent = new Intent(info.intent);
96430c53bc80be01996b45e55687885d6c05314645Patrick Dubroy        flags = info.flags;
9778403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung        firstInstallTime = info.firstInstallTime;
9831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
10131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Creates the application intent based on a component name and various launch flags.
10273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy     * Sets {@link #itemType} to {@link LauncherSettings.BaseLauncherColumns#ITEM_TYPE_APPLICATION}.
10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
10431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param className the class name of the component representing the intent
10531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param launchFlags the launch flags
10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
10731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    final void setActivity(ComponentName className, int launchFlags) {
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent = new Intent(Intent.ACTION_MAIN);
10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent.addCategory(Intent.CATEGORY_LAUNCHER);
11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent.setComponent(className);
11131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent.setFlags(launchFlags);
11273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy        itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_APPLICATION;
11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public String toString() {
117f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato        return "ApplicationInfo(title=" + title.toString() + ")";
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
1199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
120be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    public static void dumpApplicationInfoList(String tag, String label,
121be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato            ArrayList<ApplicationInfo> list) {
122be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        Log.d(tag, label + " size=" + list.size());
123be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        for (ApplicationInfo info: list) {
124c85ea570c488ee5875da78ce011abeb6942b1990Winson Chung            Log.d(tag, "   title=\"" + info.title + "\" iconBitmap="
125c85ea570c488ee5875da78ce011abeb6942b1990Winson Chung                    + info.iconBitmap + " firstInstallTime="
12678403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung                    + info.firstInstallTime);
127be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        }
128be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    }
1290589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
1300589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    public ShortcutInfo makeShortcut() {
131c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka        return new ShortcutInfo(this);
1320589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
13331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
134