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 
ShortcutAdapter(Context context)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 
getLayoutId()58     protected abstract int getLayoutId();
getText1Id()59     protected abstract int getText1Id();
getText2Id()60     protected abstract int getText2Id();
getImageId()61     protected abstract int getImageId();
getLaunchId()62     protected abstract int getLaunchId();
getAction2Id()63     protected abstract int getAction2Id();
64 
showLine2()65     protected boolean showLine2() {
66         return true;
67     }
68 
showLaunch(ShortcutInfo si)69     protected boolean showLaunch(ShortcutInfo si) {
70         return false;
71     }
72 
showAction2(ShortcutInfo si)73     protected boolean showAction2(ShortcutInfo si) {
74         return false;
75     }
76 
getAction2Text(ShortcutInfo si)77     protected String getAction2Text(ShortcutInfo si) {
78         return "Action2";
79     }
80 
onLaunchClicked(ShortcutInfo si)81     protected void onLaunchClicked(ShortcutInfo si) {
82     }
83 
onAction2Clicked(ShortcutInfo si)84     protected void onAction2Clicked(ShortcutInfo si) {
85     }
86 
setShortcuts(List<ShortcutInfo> shortcuts)87     public void setShortcuts(List<ShortcutInfo> shortcuts) {
88         mShortcuts = shortcuts;
89         notifyDataSetChanged();
90     }
91 
getShortcuts()92     public List<ShortcutInfo> getShortcuts() {
93         return mShortcuts;
94     }
95 
96     @Override
getCount()97     public int getCount() {
98         return mShortcuts == null ? 0 : mShortcuts.size();
99     }
100 
101     @Override
getItem(int position)102     public Object getItem(int position) {
103         return mShortcuts.get(position);
104     }
105 
106     @Override
getItemId(int position)107     public long getItemId(int position) {
108         return position;
109     }
110 
111     @Override
hasStableIds()112     public boolean hasStableIds() {
113         return false;
114     }
115 
116     @Override
areAllItemsEnabled()117     public boolean areAllItemsEnabled() {
118         return true;
119     }
120 
121     @Override
isEnabled(int position)122     public boolean isEnabled(int position) {
123         return true;
124     }
125 
126     @Override
getView(int position, View convertView, ViewGroup parent)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 
bindView(View view, int position, ShortcutInfo si)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
onClick(View v)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