ResolverAdapter.java revision d1e460ca091804775d96fde36ed4b020b8f154aa
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 18d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauerimport android.content.ComponentName; 198b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.Context; 208b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.Intent; 218b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.SharedPreferences; 22d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauerimport android.content.pm.ActivityInfo; 238b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.pm.ApplicationInfo; 248b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.pm.PackageManager; 258b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.content.pm.ResolveInfo; 268b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.graphics.drawable.Drawable; 278b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.os.AsyncTask; 288b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.support.v7.widget.RecyclerView; 298b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.util.Log; 308b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.view.LayoutInflater; 318b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport android.view.ViewGroup; 328b3581a045c751d6420678409846471c3262b9c6Anthony Chen 338b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport java.util.ArrayList; 348b3581a045c751d6420678409846471c3262b9c6Anthony Chenimport java.util.List; 358b3581a045c751d6420678409846471c3262b9c6Anthony Chen 36600d41797ad1cc3accc2da151d62709630d616e9Aurimas Liutikasimport androidx.car.widget.PagedListView; 37600d41797ad1cc3accc2da151d62709630d616e9Aurimas Liutikas 388b3581a045c751d6420678409846471c3262b9c6Anthony Chen/** 398b3581a045c751d6420678409846471c3262b9c6Anthony Chen * An adapter that binds each of the rows within the {@link LensResolverActivity}. 408b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 418b3581a045c751d6420678409846471c3262b9c6Anthony Chenpublic class ResolverAdapter extends RecyclerView.Adapter<ResolverListRow> 428b3581a045c751d6420678409846471c3262b9c6Anthony Chen implements PagedListView.ItemCap { 438b3581a045c751d6420678409846471c3262b9c6Anthony Chen private static final String TAG = "ResolverAdapter"; 448b3581a045c751d6420678409846471c3262b9c6Anthony Chen 458b3581a045c751d6420678409846471c3262b9c6Anthony Chen private final Context mContext; 468b3581a045c751d6420678409846471c3262b9c6Anthony Chen private final List<ResolveInfo> mResolveInfos; 478b3581a045c751d6420678409846471c3262b9c6Anthony Chen private final List<LensPickerItem> mItems = new ArrayList<>(); 488b3581a045c751d6420678409846471c3262b9c6Anthony Chen private ResolverListRow.ResolverSelectionHandler mHandler; 498b3581a045c751d6420678409846471c3262b9c6Anthony Chen 508b3581a045c751d6420678409846471c3262b9c6Anthony Chen public ResolverAdapter(Context context, List<ResolveInfo> resolveInfos) { 518b3581a045c751d6420678409846471c3262b9c6Anthony Chen mContext = context; 528b3581a045c751d6420678409846471c3262b9c6Anthony Chen mResolveInfos = resolveInfos; 538b3581a045c751d6420678409846471c3262b9c6Anthony Chen 548b3581a045c751d6420678409846471c3262b9c6Anthony Chen new LoadTask().execute(null, null, null); 558b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 568b3581a045c751d6420678409846471c3262b9c6Anthony Chen 578b3581a045c751d6420678409846471c3262b9c6Anthony Chen public void setSelectionHandler(ResolverListRow.ResolverSelectionHandler handler) { 588b3581a045c751d6420678409846471c3262b9c6Anthony Chen mHandler = handler; 598b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 608b3581a045c751d6420678409846471c3262b9c6Anthony Chen 618b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 628b3581a045c751d6420678409846471c3262b9c6Anthony Chen public ResolverListRow onCreateViewHolder(ViewGroup parent, int viewType) { 638b3581a045c751d6420678409846471c3262b9c6Anthony Chen LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 648b3581a045c751d6420678409846471c3262b9c6Anthony Chen return new ResolverListRow( 658b3581a045c751d6420678409846471c3262b9c6Anthony Chen inflater.inflate(R.layout.car_list_item_1_card, parent, false)); 668b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 678b3581a045c751d6420678409846471c3262b9c6Anthony Chen 688b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 698b3581a045c751d6420678409846471c3262b9c6Anthony Chen public void onBindViewHolder(ResolverListRow holder, int position) { 708b3581a045c751d6420678409846471c3262b9c6Anthony Chen holder.bind(mContext, mResolveInfos.get(position), mItems.get(position), mHandler); 718b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 728b3581a045c751d6420678409846471c3262b9c6Anthony Chen 738b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 748b3581a045c751d6420678409846471c3262b9c6Anthony Chen public int getItemCount() { 758b3581a045c751d6420678409846471c3262b9c6Anthony Chen return mItems == null ? 0 : mItems.size(); 768b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 778b3581a045c751d6420678409846471c3262b9c6Anthony Chen 788b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 798b3581a045c751d6420678409846471c3262b9c6Anthony Chen public void setMaxItems(int maxItems) { 808b3581a045c751d6420678409846471c3262b9c6Anthony Chen // No-op, but method override is needed for PagedListView. 818b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 828b3581a045c751d6420678409846471c3262b9c6Anthony Chen 838b3581a045c751d6420678409846471c3262b9c6Anthony Chen /** 848b3581a045c751d6420678409846471c3262b9c6Anthony Chen * An {@link AsyncTask} that will construct the corresponding launch Intents for each of the 858b3581a045c751d6420678409846471c3262b9c6Anthony Chen * activities represented by {@link #mResolveInfos}. Upon completion, that information is 868b3581a045c751d6420678409846471c3262b9c6Anthony Chen * packaged into a {@link LensPickerItem} and stored within {@link #mItems}. 878b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 888b3581a045c751d6420678409846471c3262b9c6Anthony Chen private class LoadTask extends AsyncTask<Void, Void, List<LensPickerItem>> { 898b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 908b3581a045c751d6420678409846471c3262b9c6Anthony Chen protected List<LensPickerItem> doInBackground(Void... unused) { 918b3581a045c751d6420678409846471c3262b9c6Anthony Chen List<LensPickerItem> items = new ArrayList<>(); 928b3581a045c751d6420678409846471c3262b9c6Anthony Chen 938b3581a045c751d6420678409846471c3262b9c6Anthony Chen PackageManager packageManager = mContext.getPackageManager(); 948b3581a045c751d6420678409846471c3262b9c6Anthony Chen SharedPreferences sharedPref = LensPickerUtils.getFacetSharedPrefs(mContext); 958b3581a045c751d6420678409846471c3262b9c6Anthony Chen 968b3581a045c751d6420678409846471c3262b9c6Anthony Chen for (ResolveInfo info : mResolveInfos) { 978b3581a045c751d6420678409846471c3262b9c6Anthony Chen String packageName = LensPickerUtils.getPackageName(info); 988b3581a045c751d6420678409846471c3262b9c6Anthony Chen 998b3581a045c751d6420678409846471c3262b9c6Anthony Chen try { 1008b3581a045c751d6420678409846471c3262b9c6Anthony Chen ApplicationInfo aInfo = packageManager.getApplicationInfo(packageName, 0); 1018b3581a045c751d6420678409846471c3262b9c6Anthony Chen String displayName = ""; 1028b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (LensPickerUtils.isMediaService(info)) { 1038b3581a045c751d6420678409846471c3262b9c6Anthony Chen // For media services we take the service tag instead of the package name. 1048b3581a045c751d6420678409846471c3262b9c6Anthony Chen // This is done to avoid Bluetooth showing Bluetooth Share as the package 1058b3581a045c751d6420678409846471c3262b9c6Anthony Chen // name. 1068b3581a045c751d6420678409846471c3262b9c6Anthony Chen displayName = info.loadLabel(packageManager).toString(); 1078b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (Log.isLoggable(TAG, Log.DEBUG)) { 1088b3581a045c751d6420678409846471c3262b9c6Anthony Chen Log.d(TAG, "Media service label set to: " + displayName); 1098b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1108b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1118b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1128b3581a045c751d6420678409846471c3262b9c6Anthony Chen // If we found an empty label for above case or if we did not hit the above if 1138b3581a045c751d6420678409846471c3262b9c6Anthony Chen // block then simply set this string to package name. 1148b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (displayName.equals("")) { 1158b3581a045c751d6420678409846471c3262b9c6Anthony Chen displayName = getComponentLabel(packageManager, aInfo); 1168b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 117d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer Intent launchIntent = LensPickerUtils.getLaunchIntent(packageName, info, 118d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer packageManager); 119d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer // If launchIntent is null, create an intent from the ResolverInfo 120d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer if (launchIntent == null) { 121d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer launchIntent = new Intent(); 122d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer ActivityInfo activity = info.activityInfo; 123d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer launchIntent.setComponent( 124d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer new ComponentName(activity.applicationInfo.packageName, 125d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer activity.name)); 126d1e460ca091804775d96fde36ed4b020b8f154aaNicholas Sauer } 1278b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1288b3581a045c751d6420678409846471c3262b9c6Anthony Chen items.add(new LensPickerItem(displayName, 1298b3581a045c751d6420678409846471c3262b9c6Anthony Chen getComponentIcon(packageManager, aInfo), launchIntent, 1308b3581a045c751d6420678409846471c3262b9c6Anthony Chen null /* facetId */)); 1318b3581a045c751d6420678409846471c3262b9c6Anthony Chen } catch (PackageManager.NameNotFoundException e) { 1328b3581a045c751d6420678409846471c3262b9c6Anthony Chen // skip this package. 1338b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1348b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1358b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1368b3581a045c751d6420678409846471c3262b9c6Anthony Chen return items; 1378b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1388b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1398b3581a045c751d6420678409846471c3262b9c6Anthony Chen @Override 1408b3581a045c751d6420678409846471c3262b9c6Anthony Chen protected void onPostExecute(List<LensPickerItem> items) { 1418b3581a045c751d6420678409846471c3262b9c6Anthony Chen mItems.addAll(items); 1428b3581a045c751d6420678409846471c3262b9c6Anthony Chen notifyDataSetChanged(); 1438b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1448b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1458b3581a045c751d6420678409846471c3262b9c6Anthony Chen /** 1468b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Returns the icon for the application represented by the given parameters. 1478b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 1488b3581a045c751d6420678409846471c3262b9c6Anthony Chen private Drawable getComponentIcon(PackageManager packageManager, ApplicationInfo info) { 1498b3581a045c751d6420678409846471c3262b9c6Anthony Chen return packageManager.getApplicationIcon(info); 1508b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1518b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1528b3581a045c751d6420678409846471c3262b9c6Anthony Chen /** 1538b3581a045c751d6420678409846471c3262b9c6Anthony Chen * Returns the name of the application represented by the given parameters. 1548b3581a045c751d6420678409846471c3262b9c6Anthony Chen */ 1558b3581a045c751d6420678409846471c3262b9c6Anthony Chen private String getComponentLabel(PackageManager packageManager, ApplicationInfo info) { 1568b3581a045c751d6420678409846471c3262b9c6Anthony Chen CharSequence appLabel = packageManager.getApplicationLabel(info); 1578b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1588b3581a045c751d6420678409846471c3262b9c6Anthony Chen if (appLabel == null) { 1598b3581a045c751d6420678409846471c3262b9c6Anthony Chen return null; 1608b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1618b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1628b3581a045c751d6420678409846471c3262b9c6Anthony Chen return appLabel.toString(); 1638b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1648b3581a045c751d6420678409846471c3262b9c6Anthony Chen } 1658b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1668b3581a045c751d6420678409846471c3262b9c6Anthony Chen 1678b3581a045c751d6420678409846471c3262b9c6Anthony Chen} 168