1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.content.pm;
18 
19 import android.content.ComponentName;
20 import android.content.Context;
21 import android.content.pm.PackageManager.NameNotFoundException;
22 import android.content.res.Resources;
23 import android.graphics.drawable.Drawable;
24 import android.os.UserHandle;
25 import android.os.UserManager;
26 import android.util.DisplayMetrics;
27 
28 /**
29  * A representation of an activity that can belong to this user or a managed
30  * profile associated with this user. It can be used to query the label, icon
31  * and badged icon for the activity.
32  */
33 public class LauncherActivityInfo {
34     private static final String TAG = "LauncherActivityInfo";
35 
36     private final PackageManager mPm;
37 
38     private ActivityInfo mActivityInfo;
39     private ComponentName mComponentName;
40     private UserHandle mUser;
41 
42     /**
43      * Create a launchable activity object for a given ResolveInfo and user.
44      *
45      * @param context The context for fetching resources.
46      * @param info ResolveInfo from which to create the LauncherActivityInfo.
47      * @param user The UserHandle of the profile to which this activity belongs.
48      */
LauncherActivityInfo(Context context, ActivityInfo info, UserHandle user)49     LauncherActivityInfo(Context context, ActivityInfo info, UserHandle user) {
50         this(context);
51         mActivityInfo = info;
52         mComponentName =  new ComponentName(info.packageName, info.name);
53         mUser = user;
54     }
55 
LauncherActivityInfo(Context context)56     LauncherActivityInfo(Context context) {
57         mPm = context.getPackageManager();
58     }
59 
60     /**
61      * Returns the component name of this activity.
62      *
63      * @return ComponentName of the activity
64      */
getComponentName()65     public ComponentName getComponentName() {
66         return mComponentName;
67     }
68 
69     /**
70      * Returns the user handle of the user profile that this activity belongs to. In order to
71      * persist the identity of the profile, do not store the UserHandle. Instead retrieve its
72      * serial number from UserManager. You can convert the serial number back to a UserHandle
73      * for later use.
74      *
75      * @see UserManager#getSerialNumberForUser(UserHandle)
76      * @see UserManager#getUserForSerialNumber(long)
77      *
78      * @return The UserHandle of the profile.
79      */
getUser()80     public UserHandle getUser() {
81         return mUser;
82     }
83 
84     /**
85      * Retrieves the label for the activity.
86      *
87      * @return The label for the activity.
88      */
getLabel()89     public CharSequence getLabel() {
90         // TODO: Go through LauncherAppsService
91         return mActivityInfo.loadLabel(mPm);
92     }
93 
94     /**
95      * Returns the icon for this activity, without any badging for the profile.
96      * @param density The preferred density of the icon, zero for default density. Use
97      * density DPI values from {@link DisplayMetrics}.
98      * @see #getBadgedIcon(int)
99      * @see DisplayMetrics
100      * @return The drawable associated with the activity.
101      */
getIcon(int density)102     public Drawable getIcon(int density) {
103         // TODO: Go through LauncherAppsService
104         final int iconRes = mActivityInfo.getIconResource();
105         Drawable icon = null;
106         // Get the preferred density icon from the app's resources
107         if (density != 0 && iconRes != 0) {
108             try {
109                 final Resources resources
110                         = mPm.getResourcesForApplication(mActivityInfo.applicationInfo);
111                 icon = resources.getDrawableForDensity(iconRes, density);
112             } catch (NameNotFoundException | Resources.NotFoundException exc) {
113             }
114         }
115         // Get the default density icon
116         if (icon == null) {
117             icon = mActivityInfo.loadIcon(mPm);
118         }
119         return icon;
120     }
121 
122     /**
123      * Returns the application flags from the ApplicationInfo of the activity.
124      *
125      * @return Application flags
126      * @hide remove before shipping
127      */
getApplicationFlags()128     public int getApplicationFlags() {
129         return mActivityInfo.applicationInfo.flags;
130     }
131 
132     /**
133      * Returns the application info for the appliction this activity belongs to.
134      * @return
135      */
getApplicationInfo()136     public ApplicationInfo getApplicationInfo() {
137         return mActivityInfo.applicationInfo;
138     }
139 
140     /**
141      * Returns the time at which the package was first installed.
142      *
143      * @return The time of installation of the package, in milliseconds.
144      */
getFirstInstallTime()145     public long getFirstInstallTime() {
146         try {
147             // TODO: Go through LauncherAppsService
148             return mPm.getPackageInfo(mActivityInfo.packageName,
149                     PackageManager.MATCH_UNINSTALLED_PACKAGES).firstInstallTime;
150         } catch (NameNotFoundException nnfe) {
151             // Sorry, can't find package
152             return 0;
153         }
154     }
155 
156     /**
157      * Returns the name for the acitivty from  android:name in the manifest.
158      * @return the name from android:name for the acitivity.
159      */
getName()160     public String getName() {
161         return mActivityInfo.name;
162     }
163 
164     /**
165      * Returns the activity icon with badging appropriate for the profile.
166      * @param density Optional density for the icon, or 0 to use the default density. Use
167      * {@link DisplayMetrics} for DPI values.
168      * @see DisplayMetrics
169      * @return A badged icon for the activity.
170      */
getBadgedIcon(int density)171     public Drawable getBadgedIcon(int density) {
172         Drawable originalIcon = getIcon(density);
173 
174         return mPm.getUserBadgedIcon(originalIcon, mUser);
175     }
176 }
177