ResolverAdapter.java revision 8b3581a045c751d6420678409846471c3262b9c6
18b3581a045c751d6420678409846471c3262b9c6Anthony Chen/* 28b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Copyright (C) 2016 The Android Open Source Project 38b3581a045c751d6420678409846471c3262b9c6Anthony Chen * 48b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Licensed under the Apache License, Version 2.0 (the "License"); 58b3581a045c751d6420678409846471c3262b9c6Anthony Chen * you may not use this file except in compliance with the License. 68b3581a045c751d6420678409846471c3262b9c6Anthony Chen * You may obtain a copy of the License at 78b3581a045c751d6420678409846471c3262b9c6Anthony Chen * 88b3581a045c751d6420678409846471c3262b9c6Anthony Chen * http://www.apache.org/licenses/LICENSE-2.0 98b3581a045c751d6420678409846471c3262b9c6Anthony Chen * 108b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Unless required by applicable law or agreed to in writing, software 118b3581a045c751d6420678409846471c3262b9c6Anthony Chen * distributed under the License is distributed on an "AS IS" BASIS, 128b3581a045c751d6420678409846471c3262b9c6Anthony Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b3581a045c751d6420678409846471c3262b9c6Anthony Chen * See the License for the specific language governing permissions and 148b3581a045c751d6420678409846471c3262b9c6Anthony Chen * limitations under the License. 158b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 168b3581a045c751d6420678409846471c3262b9c6Anthony Chenpackage com.android.support.car.lenspicker; 178b3581a045c751d6420678409846471c3262b9c6Anthony Chen 188b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.Context; 198b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.Intent; 208b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.SharedPreferences; 218b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.pm.ApplicationInfo; 228b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.pm.PackageManager; 238b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.pm.ResolveInfo; 248b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.graphics.drawable.Drawable; 258b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.os.AsyncTask; 268b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.support.car.ui.PagedListView; 278b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.support.v7.widget.RecyclerView; 288b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.util.Log; 298b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.view.LayoutInflater; 308b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.view.ViewGroup; 318b3581a045c751d6420678409846471c3262b9c6Anthony Chen 328b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport java.util.ArrayList; 338b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport java.util.List; 348b3581a045c751d6420678409846471c3262b9c6Anthony Chen 358b3581a045c751d6420678409846471c3262b9c6Anthony Chen/** 368b3581a045c751d6420678409846471c3262b9c6Anthony Chen * An adapter that binds each of the rows within the {@link LensResolverActivity}. 378b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 388b3581a045c751d6420678409846471c3262b9c6Anthony Chenpublic class ResolverAdapter extends RecyclerView.Adapter<ResolverListRow> 398b3581a045c751d6420678409846471c3262b9c6Anthony Chen implements PagedListView.ItemCap { 408b3581a045c751d6420678409846471c3262b9c6Anthony Chen private static final String TAG = "ResolverAdapter"; 418b3581a045c751d6420678409846471c3262b9c6Anthony Chen 428b3581a045c751d6420678409846471c3262b9c6Anthony Chen private final Context mContext; 438b3581a045c751d6420678409846471c3262b9c6Anthony Chen private final List<ResolveInfo> mResolveInfos; 448b3581a045c751d6420678409846471c3262b9c6Anthony Chen private final List<LensPickerItem> mItems = new ArrayList<>(); 458b3581a045c751d6420678409846471c3262b9c6Anthony Chen private ResolverListRow.ResolverSelectionHandler mHandler; 468b3581a045c751d6420678409846471c3262b9c6Anthony Chen 478b3581a045c751d6420678409846471c3262b9c6Anthony Chen public ResolverAdapter(Context context, List<ResolveInfo> resolveInfos) { 488b3581a045c751d6420678409846471c3262b9c6Anthony Chen mContext = context; 498b3581a045c751d6420678409846471c3262b9c6Anthony Chen mResolveInfos = resolveInfos; 508b3581a045c751d6420678409846471c3262b9c6Anthony Chen 518b3581a045c751d6420678409846471c3262b9c6Anthony Chen new LoadTask().execute(null, null, null); 528b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 538b3581a045c751d6420678409846471c3262b9c6Anthony Chen 548b3581a045c751d6420678409846471c3262b9c6Anthony Chen public void setSelectionHandler(ResolverListRow.ResolverSelectionHandler handler) { 558b3581a045c751d6420678409846471c3262b9c6Anthony Chen mHandler = handler; 568b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 578b3581a045c751d6420678409846471c3262b9c6Anthony Chen 588b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 598b3581a045c751d6420678409846471c3262b9c6Anthony Chen public ResolverListRow onCreateViewHolder(ViewGroup parent, int viewType) { 608b3581a045c751d6420678409846471c3262b9c6Anthony Chen LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 618b3581a045c751d6420678409846471c3262b9c6Anthony Chen return new ResolverListRow( 628b3581a045c751d6420678409846471c3262b9c6Anthony Chen inflater.inflate(R.layout.car_list_item_1_card, parent, false)); 638b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 648b3581a045c751d6420678409846471c3262b9c6Anthony Chen 658b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 668b3581a045c751d6420678409846471c3262b9c6Anthony Chen public void onBindViewHolder(ResolverListRow holder, int position) { 678b3581a045c751d6420678409846471c3262b9c6Anthony Chen holder.bind(mContext, mResolveInfos.get(position), mItems.get(position), mHandler); 688b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 698b3581a045c751d6420678409846471c3262b9c6Anthony Chen 708b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 718b3581a045c751d6420678409846471c3262b9c6Anthony Chen public int getItemCount() { 728b3581a045c751d6420678409846471c3262b9c6Anthony Chen return mItems == null ? 0 : mItems.size(); 738b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 748b3581a045c751d6420678409846471c3262b9c6Anthony Chen 758b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 768b3581a045c751d6420678409846471c3262b9c6Anthony Chen public void setMaxItems(int maxItems) { 778b3581a045c751d6420678409846471c3262b9c6Anthony Chen // No-op, but method override is needed for PagedListView. 788b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 798b3581a045c751d6420678409846471c3262b9c6Anthony Chen 808b3581a045c751d6420678409846471c3262b9c6Anthony Chen /** 818b3581a045c751d6420678409846471c3262b9c6Anthony Chen * An {@link AsyncTask} that will construct the corresponding launch Intents for each of the 828b3581a045c751d6420678409846471c3262b9c6Anthony Chen * activities represented by {@link #mResolveInfos}. Upon completion, that information is 838b3581a045c751d6420678409846471c3262b9c6Anthony Chen * packaged into a {@link LensPickerItem} and stored within {@link #mItems}. 848b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 858b3581a045c751d6420678409846471c3262b9c6Anthony Chen private class LoadTask extends AsyncTask<Void, Void, List<LensPickerItem>> { 868b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 878b3581a045c751d6420678409846471c3262b9c6Anthony Chen protected List<LensPickerItem> doInBackground(Void... unused) { 888b3581a045c751d6420678409846471c3262b9c6Anthony Chen List<LensPickerItem> items = new ArrayList<>(); 898b3581a045c751d6420678409846471c3262b9c6Anthony Chen 908b3581a045c751d6420678409846471c3262b9c6Anthony Chen PackageManager packageManager = mContext.getPackageManager(); 918b3581a045c751d6420678409846471c3262b9c6Anthony Chen SharedPreferences sharedPref = LensPickerUtils.getFacetSharedPrefs(mContext); 928b3581a045c751d6420678409846471c3262b9c6Anthony Chen 938b3581a045c751d6420678409846471c3262b9c6Anthony Chen for (ResolveInfo info : mResolveInfos) { 948b3581a045c751d6420678409846471c3262b9c6Anthony Chen String packageName = LensPickerUtils.getPackageName(info); 958b3581a045c751d6420678409846471c3262b9c6Anthony Chen Intent launchIntent = LensPickerUtils.getLaunchIntent(packageName, info, 968b3581a045c751d6420678409846471c3262b9c6Anthony Chen packageManager, sharedPref); 978b3581a045c751d6420678409846471c3262b9c6Anthony Chen 988b3581a045c751d6420678409846471c3262b9c6Anthony Chen try { 998b3581a045c751d6420678409846471c3262b9c6Anthony Chen ApplicationInfo aInfo = packageManager.getApplicationInfo(packageName, 0); 1008b3581a045c751d6420678409846471c3262b9c6Anthony Chen String displayName = ""; 1018b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (LensPickerUtils.isMediaService(info)) { 1028b3581a045c751d6420678409846471c3262b9c6Anthony Chen // For media services we take the service tag instead of the package name. 1038b3581a045c751d6420678409846471c3262b9c6Anthony Chen // This is done to avoid Bluetooth showing Bluetooth Share as the package 1048b3581a045c751d6420678409846471c3262b9c6Anthony Chen // name. 1058b3581a045c751d6420678409846471c3262b9c6Anthony Chen displayName = info.loadLabel(packageManager).toString(); 1068b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (Log.isLoggable(TAG, Log.DEBUG)) { 1078b3581a045c751d6420678409846471c3262b9c6Anthony Chen Log.d(TAG, "Media service label set to: " + displayName); 1088b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1098b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1108b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1118b3581a045c751d6420678409846471c3262b9c6Anthony Chen // If we found an empty label for above case or if we did not hit the above if 1128b3581a045c751d6420678409846471c3262b9c6Anthony Chen // block then simply set this string to package name. 1138b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (displayName.equals("")) { 1148b3581a045c751d6420678409846471c3262b9c6Anthony Chen displayName = getComponentLabel(packageManager, aInfo); 1158b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1168b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1178b3581a045c751d6420678409846471c3262b9c6Anthony Chen items.add(new LensPickerItem(displayName, 1188b3581a045c751d6420678409846471c3262b9c6Anthony Chen getComponentIcon(packageManager, aInfo), launchIntent, 1198b3581a045c751d6420678409846471c3262b9c6Anthony Chen null /* facetId */)); 1208b3581a045c751d6420678409846471c3262b9c6Anthony Chen } catch (PackageManager.NameNotFoundException e) { 1218b3581a045c751d6420678409846471c3262b9c6Anthony Chen // skip this package. 1228b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1238b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1248b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1258b3581a045c751d6420678409846471c3262b9c6Anthony Chen return items; 1268b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1278b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1288b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 1298b3581a045c751d6420678409846471c3262b9c6Anthony Chen protected void onPostExecute(List<LensPickerItem> items) { 1308b3581a045c751d6420678409846471c3262b9c6Anthony Chen mItems.addAll(items); 1318b3581a045c751d6420678409846471c3262b9c6Anthony Chen notifyDataSetChanged(); 1328b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1338b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1348b3581a045c751d6420678409846471c3262b9c6Anthony Chen /** 1358b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Returns the icon for the application represented by the given parameters. 1368b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 1378b3581a045c751d6420678409846471c3262b9c6Anthony Chen private Drawable getComponentIcon(PackageManager packageManager, ApplicationInfo info) { 1388b3581a045c751d6420678409846471c3262b9c6Anthony Chen return packageManager.getApplicationIcon(info); 1398b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1408b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1418b3581a045c751d6420678409846471c3262b9c6Anthony Chen /** 1428b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Returns the name of the application represented by the given parameters. 1438b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 1448b3581a045c751d6420678409846471c3262b9c6Anthony Chen private String getComponentLabel(PackageManager packageManager, ApplicationInfo info) { 1458b3581a045c751d6420678409846471c3262b9c6Anthony Chen CharSequence appLabel = packageManager.getApplicationLabel(info); 1468b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1478b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (appLabel == null) { 1488b3581a045c751d6420678409846471c3262b9c6Anthony Chen return null; 1498b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1508b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1518b3581a045c751d6420678409846471c3262b9c6Anthony Chen return appLabel.toString(); 1528b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1538b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1548b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1558b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1568b3581a045c751d6420678409846471c3262b9c6Anthony Chen} 157