ApplicationInfo.java revision c3eecff9043759926df124483b45fe8f4436ae7c
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
17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2;
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 application name.
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    CharSequence title;
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * The intent used to start the application.
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    Intent intent;
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     * A bitmap version of the application icon.
489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato     */
499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    Bitmap iconBitmap;
509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
5178403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung    /**
5278403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung     * The time at which the app was first installed.
5378403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung     */
5478403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung    long firstInstallTime;
5578403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung
560589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    ComponentName componentName;
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
58cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy    static final int DOWNLOADED_FLAG = 1;
59cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy    static final int UPDATED_SYSTEM_APP_FLAG = 2;
60cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy
613d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy    int flags = 0;
620589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
630589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    ApplicationInfo() {
640589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_SHORTCUT;
650589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
680589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato     * Must not hold the Context.
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
70c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung    public ApplicationInfo(PackageManager pm, ResolveInfo info, IconCache iconCache,
71c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung            HashMap<Object, CharSequence> labelCache) {
723d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        final String packageName = info.activityInfo.applicationInfo.packageName;
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
743d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        this.componentName = new ComponentName(packageName, info.activityInfo.name);
750589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        this.container = ItemInfo.NO_ID;
760589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        this.setActivity(componentName,
770589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato                Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
780589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
793d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        try {
803d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            int appFlags = pm.getApplicationInfo(packageName, 0).flags;
813d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
823d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy                flags |= DOWNLOADED_FLAG;
833d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy
84cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy                if ((appFlags & android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
85cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy                    flags |= UPDATED_SYSTEM_APP_FLAG;
86cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy                }
873d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            }
88cd953711fcbb6c8c6579fb7127e3c86103c0d409Patrick Dubroy            firstInstallTime = pm.getPackageInfo(packageName, 0).firstInstallTime;
893d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        } catch (NameNotFoundException e) {
903d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy            Log.d(TAG, "PackageManager.getApplicationInfo failed for " + packageName);
913d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy        }
923d605d5bbef35e3b8aded44c5ef7fe3948f8f7d5Patrick Dubroy
93c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung        iconCache.getTitleAndIcon(this, info, labelCache);
9431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
95c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung
9631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public ApplicationInfo(ApplicationInfo info) {
9731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super(info);
980589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        componentName = info.componentName;
9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        title = info.title.toString();
10031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent = new Intent(info.intent);
101430c53bc80be01996b45e55687885d6c05314645Patrick Dubroy        flags = info.flags;
10278403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung        firstInstallTime = info.firstInstallTime;
10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
10431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Creates the application intent based on a component name and various launch flags.
10773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy     * Sets {@link #itemType} to {@link LauncherSettings.BaseLauncherColumns#ITEM_TYPE_APPLICATION}.
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param className the class name of the component representing the intent
11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param launchFlags the launch flags
11131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    final void setActivity(ComponentName className, int launchFlags) {
11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent = new Intent(Intent.ACTION_MAIN);
11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent.addCategory(Intent.CATEGORY_LAUNCHER);
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent.setComponent(className);
11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        intent.setFlags(launchFlags);
11773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy        itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_APPLICATION;
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public String toString() {
122f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato        return "ApplicationInfo(title=" + title.toString() + ")";
12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
1249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato
125be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    public static void dumpApplicationInfoList(String tag, String label,
126be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato            ArrayList<ApplicationInfo> list) {
127be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        Log.d(tag, label + " size=" + list.size());
128be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        for (ApplicationInfo info: list) {
129c85ea570c488ee5875da78ce011abeb6942b1990Winson Chung            Log.d(tag, "   title=\"" + info.title + "\" iconBitmap="
130c85ea570c488ee5875da78ce011abeb6942b1990Winson Chung                    + info.iconBitmap + " firstInstallTime="
13178403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung                    + info.firstInstallTime);
132be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato        }
133be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato    }
1340589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
1350589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    public ShortcutInfo makeShortcut() {
1360589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        return new ShortcutInfo(this);
1370589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
139