Home | History | Annotate | Download | only in shortcutdemo
      1 /*
      2  * Copyright (C) 2016 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 package com.example.android.pm.shortcutdemo;
     17 
     18 import android.content.Context;
     19 import android.content.pm.LauncherApps;
     20 import android.content.pm.PackageManager;
     21 import android.content.pm.PackageManager.NameNotFoundException;
     22 import android.content.pm.ShortcutInfo;
     23 import android.content.res.Resources;
     24 import android.graphics.Bitmap;
     25 import android.graphics.BitmapFactory;
     26 import android.graphics.drawable.BitmapDrawable;
     27 import android.graphics.drawable.Drawable;
     28 import android.os.ParcelFileDescriptor;
     29 import android.util.Log;
     30 import android.view.LayoutInflater;
     31 import android.view.View;
     32 import android.view.View.OnClickListener;
     33 import android.view.ViewGroup;
     34 import android.widget.BaseAdapter;
     35 import android.widget.Button;
     36 import android.widget.ImageView;
     37 import android.widget.TextView;
     38 
     39 import java.io.IOException;
     40 import java.util.List;
     41 
     42 public abstract class ShortcutAdapter extends BaseAdapter implements OnClickListener {
     43     public static final String TAG = "ShortcutDemo";
     44 
     45     private final Context mContext;
     46     private final LayoutInflater mInflater;
     47     private LauncherApps mLauncherApps;
     48     private final AppLabelCache mAppLabelCache;
     49     private List<ShortcutInfo> mShortcuts;
     50 
     51     public ShortcutAdapter(Context context) {
     52         mContext = context;
     53         mAppLabelCache = new AppLabelCache(mContext);
     54         mInflater = mContext.getSystemService(LayoutInflater.class);
     55         mLauncherApps = mContext.getSystemService(LauncherApps.class);
     56     }
     57 
     58     protected abstract int getLayoutId();
     59     protected abstract int getText1Id();
     60     protected abstract int getText2Id();
     61     protected abstract int getImageId();
     62     protected abstract int getLaunchId();
     63     protected abstract int getAction2Id();
     64 
     65     protected boolean showLine2() {
     66         return true;
     67     }
     68 
     69     protected boolean showLaunch(ShortcutInfo si) {
     70         return false;
     71     }
     72 
     73     protected boolean showAction2(ShortcutInfo si) {
     74         return false;
     75     }
     76 
     77     protected String getAction2Text(ShortcutInfo si) {
     78         return "Action2";
     79     }
     80 
     81     protected void onLaunchClicked(ShortcutInfo si) {
     82     }
     83 
     84     protected void onAction2Clicked(ShortcutInfo si) {
     85     }
     86 
     87     public void setShortcuts(List<ShortcutInfo> shortcuts) {
     88         mShortcuts = shortcuts;
     89         notifyDataSetChanged();
     90     }
     91 
     92     public List<ShortcutInfo> getShortcuts() {
     93         return mShortcuts;
     94     }
     95 
     96     @Override
     97     public int getCount() {
     98         return mShortcuts == null ? 0 : mShortcuts.size();
     99     }
    100 
    101     @Override
    102     public Object getItem(int position) {
    103         return mShortcuts.get(position);
    104     }
    105 
    106     @Override
    107     public long getItemId(int position) {
    108         return position;
    109     }
    110 
    111     @Override
    112     public boolean hasStableIds() {
    113         return false;
    114     }
    115 
    116     @Override
    117     public boolean areAllItemsEnabled() {
    118         return true;
    119     }
    120 
    121     @Override
    122     public boolean isEnabled(int position) {
    123         return true;
    124     }
    125 
    126     @Override
    127     public View getView(int position, View convertView, ViewGroup parent) {
    128         final View view;
    129         if (convertView != null) {
    130             view = convertView;
    131         } else {
    132             view = mInflater.inflate(getLayoutId(), null);
    133         }
    134 
    135         bindView(view, position, mShortcuts.get(position));
    136 
    137         return view;
    138     }
    139 
    140     public void bindView(View view, int position, ShortcutInfo si) {
    141         {
    142             final View v = view.findViewById(getLaunchId());
    143             v.setVisibility(View.GONE);
    144             if (showLaunch(si)) {
    145                 v.setOnClickListener(this);
    146                 v.setVisibility(View.VISIBLE);
    147             }
    148         }
    149         {
    150             final Button v = (Button) view.findViewById(getAction2Id());
    151             v.setVisibility(View.GONE);
    152             if (showAction2(si)) {
    153                 v.setOnClickListener(this);
    154                 v.setVisibility(View.VISIBLE);
    155                 v.setText(getAction2Text(si));
    156             }
    157         }
    158 
    159         final TextView line1 = (TextView) view.findViewById(getText1Id());
    160         final TextView line2 = (TextView) view.findViewById(getText2Id());
    161 
    162         view.setTag(si);
    163 
    164         line1.setText(si.getShortLabel());
    165         if (showLine2()) {
    166             line2.setText(
    167                     si.getId() + (si.isDynamic() ? " [dynamic]" : "")
    168                             + (si.isDeclaredInManifest() ? " [manifest]" : "")
    169                             + (si.isPinned() ? " [pinned]" : "") + "\n"
    170                             + (si.isEnabled() ? "" : si.getDisabledMessage()) + "\n"
    171                             + "Long label: " + si.getLongLabel() + "\n"
    172                             + "App: " + mAppLabelCache.getAppLabel(si.getPackage()));
    173             line2.setVisibility(View.VISIBLE);
    174         } else {
    175             line2.setVisibility(View.GONE);
    176         }
    177 
    178         // view.setBackgroundColor(si.isPinned() ? Color.rgb(255, 255, 192) : Color.WHITE);
    179 
    180         // TODO Do it on worker thread
    181         final ImageView image = (ImageView) view.findViewById(getImageId());
    182         if (!mLauncherApps.hasShortcutHostPermission()) {
    183             image.setVisibility(View.GONE);
    184         } else {
    185             image.setVisibility(View.VISIBLE);
    186             image.setImageDrawable(mLauncherApps.getShortcutBadgedIconDrawable(si,
    187                     mContext.getResources().getDisplayMetrics().densityDpi));
    188         }
    189     }
    190 
    191     @Override
    192     public void onClick(View v) {
    193         final ShortcutInfo si = (ShortcutInfo)(((View) v.getParent()).getTag());
    194         if (v.getId() == getLaunchId()) {
    195             onLaunchClicked(si);
    196         } else if (v.getId() == getAction2Id()) {
    197             onAction2Clicked(si);
    198         }
    199     }
    200 }
    201