• 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.Context;
25 import android.content.pm.PackageManager;
26 import android.content.res.Resources;
27 import android.graphics.Bitmap;
28 import android.graphics.Canvas;
29 import android.graphics.Color;
30 import android.graphics.Rect;
31 import android.graphics.drawable.BitmapDrawable;
32 import android.graphics.drawable.Drawable;
33 import android.os.Build;
34 import android.os.Bundle;
35 import android.os.UserHandle;
36 import android.os.UserManager;
37 import android.view.View;
38 import android.widget.Toast;
39 
40 import com.android.launcher3.IconCache;
41 import com.android.launcher3.R;
42 
43 import java.util.ArrayList;
44 import java.util.List;
45 
46 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
47 class AppWidgetManagerCompatVL extends AppWidgetManagerCompat {
48 
49     private final UserManager mUserManager;
50     private final PackageManager mPm;
51 
AppWidgetManagerCompatVL(Context context)52     AppWidgetManagerCompatVL(Context context) {
53         super(context);
54         mPm = context.getPackageManager();
55         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
56     }
57 
58     @Override
getAllProviders()59     public List<AppWidgetProviderInfo> getAllProviders() {
60         ArrayList<AppWidgetProviderInfo> providers = new ArrayList<AppWidgetProviderInfo>();
61         for (UserHandle user : mUserManager.getUserProfiles()) {
62             providers.addAll(mAppWidgetManager.getInstalledProvidersForProfile(user));
63         }
64         return providers;
65     }
66 
67     @Override
loadLabel(AppWidgetProviderInfo info)68     public String loadLabel(AppWidgetProviderInfo info) {
69         return info.loadLabel(mPm);
70     }
71 
72     @Override
bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info, Bundle options)73     public boolean bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info,
74             Bundle options) {
75         return mAppWidgetManager.bindAppWidgetIdIfAllowed(
76                 appWidgetId, info.getProfile(), info.provider, options);
77     }
78 
79     @Override
getUser(AppWidgetProviderInfo info)80     public UserHandleCompat getUser(AppWidgetProviderInfo info) {
81         return UserHandleCompat.fromUser(info.getProfile());
82     }
83 
84     @Override
startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity, AppWidgetHost host, int requestCode)85     public void startConfigActivity(AppWidgetProviderInfo info, int widgetId, Activity activity,
86             AppWidgetHost host, int requestCode) {
87         try {
88             host.startAppWidgetConfigureActivityForResult(activity, widgetId, 0, requestCode, null);
89         } catch (ActivityNotFoundException e) {
90             Toast.makeText(activity, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
91         } catch (SecurityException e) {
92             Toast.makeText(activity, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
93         }
94     }
95 
96     @Override
loadPreview(AppWidgetProviderInfo info)97     public Drawable loadPreview(AppWidgetProviderInfo info) {
98         return info.loadPreviewImage(mContext, 0);
99     }
100 
101     @Override
loadIcon(AppWidgetProviderInfo info, IconCache cache)102     public Drawable loadIcon(AppWidgetProviderInfo info, IconCache cache) {
103         return info.loadIcon(mContext, cache.getFullResIconDpi());
104     }
105 
106     @Override
getBadgeBitmap(AppWidgetProviderInfo info, Bitmap bitmap)107     public Bitmap getBadgeBitmap(AppWidgetProviderInfo info, Bitmap bitmap) {
108         if (info.getProfile().equals(android.os.Process.myUserHandle())) {
109             return bitmap;
110         }
111 
112         // Add a user badge in the bottom right of the image.
113         final Resources res = mContext.getResources();
114         final int badgeSize = res.getDimensionPixelSize(R.dimen.profile_badge_size);
115         final int badgeMargin = res.getDimensionPixelSize(R.dimen.profile_badge_margin);
116         final Rect badgeLocation = new Rect(0, 0, badgeSize, badgeSize);
117 
118         final int top = bitmap.getHeight() - badgeSize - badgeMargin;
119         if (res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
120             badgeLocation.offset(badgeMargin, top);
121         } else {
122             badgeLocation.offset(bitmap.getWidth() - badgeSize - badgeMargin, top);
123         }
124 
125         Drawable drawable = mPm.getUserBadgedDrawableForDensity(
126                 new BitmapDrawable(res, bitmap), info.getProfile(), badgeLocation, 0);
127 
128         if (drawable instanceof BitmapDrawable) {
129             return ((BitmapDrawable) drawable).getBitmap();
130         }
131 
132         bitmap.eraseColor(Color.TRANSPARENT);
133         Canvas c = new Canvas(bitmap);
134         drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
135         drawable.draw(c);
136         c.setBitmap(null);
137         return bitmap;
138     }
139 }
140