• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
AppWidgetManagerCompatVL(Context context)56     AppWidgetManagerCompatVL(Context context) {
57         super(context);
58         mPm = context.getPackageManager();
59         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
60     }
61 
62     @Override
getAllProviders()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
loadLabel(LauncherAppWidgetProviderInfo info)72     public String loadLabel(LauncherAppWidgetProviderInfo info) {
73         return info.getLabel(mPm);
74     }
75 
76     @Override
bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info, Bundle options)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
getUser(LauncherAppWidgetProviderInfo info)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
startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, AppWidgetHost host, int requestCode)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
loadPreview(AppWidgetProviderInfo info)102     public Drawable loadPreview(AppWidgetProviderInfo info) {
103         return info.loadPreviewImage(mContext, 0);
104     }
105 
106     @Override
loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache)107     public Drawable loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache) {
108         return info.getIcon(mContext, cache);
109     }
110 
111     @Override
getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap, int imageWidth, int imageHeight)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
findProvider(ComponentName provider, UserHandleCompat user)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
getAllProvidersMap()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