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.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 
     52     AppWidgetManagerCompatVL(Context context) {
     53         super(context);
     54         mPm = context.getPackageManager();
     55         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
     56     }
     57 
     58     @Override
     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
     68     public String loadLabel(AppWidgetProviderInfo info) {
     69         return info.loadLabel(mPm);
     70     }
     71 
     72     @Override
     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
     80     public UserHandleCompat getUser(AppWidgetProviderInfo info) {
     81         return UserHandleCompat.fromUser(info.getProfile());
     82     }
     83 
     84     @Override
     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
     97     public Drawable loadPreview(AppWidgetProviderInfo info) {
     98         return info.loadPreviewImage(mContext, 0);
     99     }
    100 
    101     @Override
    102     public Drawable loadIcon(AppWidgetProviderInfo info, IconCache cache) {
    103         return info.loadIcon(mContext, cache.getFullResIconDpi());
    104     }
    105 
    106     @Override
    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