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