1 /*
2  * Copyright (C) 2017 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 com.android.settingslib.applications;
18 
19 import android.app.AppGlobals;
20 import android.content.ComponentName;
21 import android.content.Context;
22 import android.content.pm.ApplicationInfo;
23 import android.content.pm.ComponentInfo;
24 import android.content.pm.PackageItemInfo;
25 import android.content.pm.PackageManager;
26 import android.graphics.drawable.Drawable;
27 import android.os.RemoteException;
28 import android.util.IconDrawableFactory;
29 
30 import androidx.annotation.Nullable;
31 
32 import com.android.settingslib.widget.CandidateInfo;
33 
34 /**
35  * Data model representing an app in DefaultAppPicker UI.
36  */
37 public class DefaultAppInfo extends CandidateInfo {
38 
39     public final int userId;
40     public final ComponentName componentName;
41     public final PackageItemInfo packageItemInfo;
42     public final String summary;
43     protected final PackageManager mPm;
44     private final Context mContext;
45 
DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn)46     public DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn) {
47         this(context, pm, uid, cn, null /* summary */, true /* enabled */);
48     }
49 
DefaultAppInfo(Context context, PackageManager pm, int uid, PackageItemInfo info)50     public DefaultAppInfo(Context context, PackageManager pm, int uid, PackageItemInfo info) {
51         this(context, pm, uid, info, null /* summary */, true /* enabled */);
52     }
53 
DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn, String summary, boolean enabled)54     public DefaultAppInfo(Context context, PackageManager pm, int uid, ComponentName cn,
55                           String summary, boolean enabled) {
56         super(enabled);
57         mContext = context;
58         mPm = pm;
59         packageItemInfo = null;
60         userId = uid;
61         componentName = cn;
62         this.summary = summary;
63     }
64 
DefaultAppInfo(Context context, PackageManager pm, int uid, PackageItemInfo info, String summary, boolean enabled)65     public DefaultAppInfo(Context context, PackageManager pm, int uid, PackageItemInfo info,
66                           String summary, boolean enabled) {
67         super(enabled);
68         mContext = context;
69         mPm = pm;
70         userId = uid;
71         packageItemInfo = info;
72         componentName = null;
73         this.summary = summary;
74     }
75 
76     @Override
loadLabel()77     public CharSequence loadLabel() {
78         if (componentName != null) {
79             try {
80                 final ComponentInfo componentInfo = getComponentInfo();
81                 if (componentInfo != null) {
82                     return componentInfo.loadLabel(mPm);
83                 } else {
84                     final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
85                             componentName.getPackageName(), 0, userId);
86                     return appInfo.loadLabel(mPm);
87                 }
88             } catch (PackageManager.NameNotFoundException e) {
89                 return null;
90             }
91         } else if (packageItemInfo != null) {
92             return packageItemInfo.loadLabel(mPm);
93         } else {
94             return null;
95         }
96 
97     }
98 
getSummary()99     public @Nullable String getSummary() {
100         return this.summary;
101     }
102 
103     @Override
loadIcon()104     public Drawable loadIcon() {
105         final IconDrawableFactory factory = IconDrawableFactory.newInstance(mContext);
106         if (componentName != null) {
107             try {
108                 final ComponentInfo componentInfo = getComponentInfo();
109                 final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
110                         componentName.getPackageName(), 0, userId);
111                 if (componentInfo != null) {
112                     return factory.getBadgedIcon(componentInfo, appInfo, userId);
113                 } else {
114                     return factory.getBadgedIcon(appInfo);
115                 }
116             } catch (PackageManager.NameNotFoundException e) {
117                 return null;
118             }
119         }
120         if (packageItemInfo != null) {
121             try {
122                 final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
123                         packageItemInfo.packageName, 0, userId);
124                 return factory.getBadgedIcon(packageItemInfo, appInfo, userId);
125             } catch (PackageManager.NameNotFoundException e) {
126                 return null;
127             }
128         } else {
129             return null;
130         }
131     }
132 
133     @Override
getKey()134     public String getKey() {
135         if (componentName != null) {
136             return componentName.flattenToString();
137         } else if (packageItemInfo != null) {
138             return packageItemInfo.packageName;
139         } else {
140             return null;
141         }
142     }
143 
getComponentInfo()144     private ComponentInfo getComponentInfo() {
145         try {
146             ComponentInfo componentInfo = AppGlobals.getPackageManager().getActivityInfo(
147                     componentName, 0, userId);
148             if (componentInfo == null) {
149                 componentInfo = AppGlobals.getPackageManager().getServiceInfo(
150                         componentName, 0, userId);
151             }
152             return componentInfo;
153         } catch (RemoteException e) {
154             return null;
155         }
156     }
157 }
158