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 com.android.launcher3.compat; 18 19 import android.annotation.TargetApi; 20 import android.app.Activity; 21 import android.appwidget.AppWidgetHost; 22 import android.appwidget.AppWidgetProviderInfo; 23 import android.content.ActivityNotFoundException; 24 import android.content.ComponentName; 25 import android.content.Context; 26 import android.content.pm.PackageManager; 27 import android.content.res.Resources; 28 import android.graphics.Bitmap; 29 import android.graphics.Canvas; 30 import android.graphics.Color; 31 import android.graphics.Rect; 32 import android.graphics.drawable.BitmapDrawable; 33 import android.graphics.drawable.Drawable; 34 import android.os.Build; 35 import android.os.Bundle; 36 import android.os.UserHandle; 37 import android.os.UserManager; 38 import android.view.View; 39 import android.widget.Toast; 40 41 import com.android.launcher3.IconCache; 42 import com.android.launcher3.LauncherAppWidgetProviderInfo; 43 import com.android.launcher3.R; 44 import com.android.launcher3.util.ComponentKey; 45 46 import java.util.ArrayList; 47 import java.util.HashMap; 48 import java.util.List; 49 50 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 51 class AppWidgetManagerCompatVL extends AppWidgetManagerCompat { 52 53 private final UserManager mUserManager; 54 private final PackageManager mPm; 55 56 AppWidgetManagerCompatVL(Context context) { 57 super(context); 58 mPm = context.getPackageManager(); 59 mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 60 } 61 62 @Override 63 public List<AppWidgetProviderInfo> getAllProviders() { 64 ArrayList<AppWidgetProviderInfo> providers = new ArrayList<AppWidgetProviderInfo>(); 65 for (UserHandle user : mUserManager.getUserProfiles()) { 66 providers.addAll(mAppWidgetManager.getInstalledProvidersForProfile(user)); 67 } 68 return providers; 69 } 70 71 @Override 72 public String loadLabel(LauncherAppWidgetProviderInfo info) { 73 return info.getLabel(mPm); 74 } 75 76 @Override 77 public boolean bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info, 78 Bundle options) { 79 return mAppWidgetManager.bindAppWidgetIdIfAllowed( 80 appWidgetId, info.getProfile(), info.provider, options); 81 } 82 83 @Override 84 public UserHandleCompat getUser(LauncherAppWidgetProviderInfo info) { 85 if (info.isCustomWidget) { 86 return UserHandleCompat.myUserHandle(); 87 } 88 return UserHandleCompat.fromUser(info.getProfile()); 89 } 90 91 @Override 92 public void startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, 93 AppWidgetHost host, int requestCode) { 94 try { 95 host.startAppWidgetConfigureActivityForResult(activity, widgetId, 0, requestCode, null); 96 } catch (ActivityNotFoundException | SecurityException e) { 97 Toast.makeText(activity, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 98 } 99 } 100 101 @Override 102 public Drawable loadPreview(AppWidgetProviderInfo info) { 103 return info.loadPreviewImage(mContext, 0); 104 } 105 106 @Override 107 public Drawable loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache) { 108 return info.getIcon(mContext, cache); 109 } 110 111 @Override 112 public Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap, 113 int imageWidth, int imageHeight) { 114 if (info.isCustomWidget || info.getProfile().equals(android.os.Process.myUserHandle())) { 115 return bitmap; 116 } 117 118 // Add a user badge in the bottom right of the image. 119 final Resources res = mContext.getResources(); 120 final int badgeMinTop = res.getDimensionPixelSize(R.dimen.profile_badge_minimum_top); 121 122 // choose min between badge size defined for widget tray versus width, height of the image. 123 // Width, height of the image can be smaller than widget tray badge size when being dropped 124 // to the workspace. 125 final int badgeSize = Math.min(res.getDimensionPixelSize(R.dimen.profile_badge_size), 126 Math.min(imageWidth, imageHeight - badgeMinTop)); 127 final Rect badgeLocation = new Rect(0, 0, badgeSize, badgeSize); 128 129 final int top = Math.max(imageHeight - badgeSize, badgeMinTop); 130 131 if (res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { 132 badgeLocation.offset(0, top); 133 } else { 134 badgeLocation.offset(bitmap.getWidth() - badgeSize, top); 135 } 136 137 Drawable drawable = mPm.getUserBadgedDrawableForDensity( 138 new BitmapDrawable(res, bitmap), info.getProfile(), badgeLocation, 0); 139 140 if (drawable instanceof BitmapDrawable) { 141 return ((BitmapDrawable) drawable).getBitmap(); 142 } 143 144 bitmap.eraseColor(Color.TRANSPARENT); 145 Canvas c = new Canvas(bitmap); 146 drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); 147 drawable.draw(c); 148 c.setBitmap(null); 149 return bitmap; 150 } 151 152 @Override 153 public LauncherAppWidgetProviderInfo findProvider(ComponentName provider, UserHandleCompat user) { 154 for (AppWidgetProviderInfo info : mAppWidgetManager 155 .getInstalledProvidersForProfile(user.getUser())) { 156 if (info.provider.equals(provider)) { 157 return LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info); 158 } 159 } 160 return null; 161 } 162 163 @Override 164 public HashMap<ComponentKey, AppWidgetProviderInfo> getAllProvidersMap() { 165 HashMap<ComponentKey, AppWidgetProviderInfo> result = new HashMap<>(); 166 for (UserHandle user : mUserManager.getUserProfiles()) { 167 UserHandleCompat userHandle = UserHandleCompat.fromUser(user); 168 for (AppWidgetProviderInfo info : 169 mAppWidgetManager.getInstalledProvidersForProfile(user)) { 170 result.put(new ComponentKey(info.provider, userHandle), info); 171 } 172 } 173 return result; 174 } 175 } 176