Home | History | Annotate | Download | only in compat
      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