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