1 /* 2 * Copyright (C) 2010 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.apps.tag.record; 18 19 import com.android.apps.tag.R; 20 import com.google.common.collect.Lists; 21 22 import android.app.Activity; 23 import android.content.ComponentName; 24 import android.content.Intent; 25 import android.content.pm.ActivityInfo; 26 import android.content.pm.PackageManager; 27 import android.content.pm.ResolveInfo; 28 import android.util.Log; 29 import android.view.LayoutInflater; 30 import android.view.View; 31 import android.view.View.OnClickListener; 32 import android.view.ViewGroup; 33 import android.view.ViewGroup.LayoutParams; 34 import android.widget.ImageView; 35 import android.widget.LinearLayout; 36 import android.widget.TextView; 37 38 import java.util.Collections; 39 import java.util.Comparator; 40 import java.util.List; 41 42 /** 43 * Utilities for parsed records to use. 44 */ 45 public class RecordUtils { 46 /** 47 * Contains info for click events that happen on views created via {@link #getViewsForIntent}. 48 */ 49 public static final class ClickInfo { 50 public Activity activity; 51 public Intent intent; 52 ClickInfo(Activity activity, Intent intent)53 public ClickInfo(Activity activity, Intent intent) { 54 this.activity = activity; 55 this.intent = intent; 56 } 57 } 58 59 /** 60 * Creates one or more views for a parsed record that wants to display an actionable intent. 61 * The views will have a {@link ClickInfo} set as their tag. 62 */ getViewsForIntent(Activity activity, LayoutInflater inflater, ViewGroup parent, OnClickListener listener, Intent intent, String description)63 public static View getViewsForIntent(Activity activity, LayoutInflater inflater, 64 ViewGroup parent, OnClickListener listener, Intent intent, String description) { 65 // Lookup which packages can handle this intent. 66 PackageManager pm = activity.getPackageManager(); 67 int flags = PackageManager.GET_RESOLVED_FILTER | PackageManager.MATCH_DEFAULT_ONLY; 68 List<ResolveInfo> activities = pm.queryIntentActivities(intent, flags); 69 int numActivities = activities.size(); 70 if (numActivities == 0 || (numActivities == 1 && !activities.get(0).activityInfo.enabled)) { 71 TextView text = (TextView) inflater.inflate(R.layout.tag_text, parent, false); 72 text.setText(description); 73 return text; 74 } else if (numActivities == 1) { 75 return buildActivityView(activity, activities.get(0), pm, inflater, parent, listener, 76 intent, description); 77 } else { 78 // Build a container to hold the multiple entries 79 LinearLayout container = new LinearLayout(activity); 80 container.setOrientation(LinearLayout.VERTICAL); 81 container.setLayoutParams(new LayoutParams( 82 LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 83 84 // Create an entry for each activity that can handle the URI 85 for (ResolveInfo resolveInfo : activities) { 86 if (!resolveInfo.activityInfo.enabled) { 87 continue; 88 } 89 90 if (container.getChildCount() > 0) { 91 inflater.inflate(R.layout.tag_divider, container); 92 } 93 // Clone the intent for each view so they can each have their own components setup 94 Intent clone = new Intent(intent); 95 container.addView(buildActivityView(activity, resolveInfo, pm, inflater, container, 96 listener, clone, description)); 97 } 98 return container; 99 } 100 } 101 102 /** 103 * Build a view to display a single activity that can handle this URI. 104 */ buildActivityView(Activity activity, ResolveInfo resolveInfo, PackageManager pm, LayoutInflater inflater, ViewGroup parent, OnClickListener listener, Intent intent, String defaultText)105 private static View buildActivityView(Activity activity, ResolveInfo resolveInfo, PackageManager pm, 106 LayoutInflater inflater, ViewGroup parent, OnClickListener listener, Intent intent, 107 String defaultText) { 108 ActivityInfo activityInfo = resolveInfo.activityInfo; 109 110 intent.setAction(resolveInfo.filter.getAction(0)); 111 intent.setComponent(new ComponentName(activityInfo.packageName, activityInfo.name)); 112 113 View item = inflater.inflate(R.layout.tag_uri, parent, false); 114 item.setOnClickListener(listener); 115 item.setTag(new ClickInfo(activity, intent)); 116 117 ImageView icon = (ImageView) item.findViewById(R.id.icon); 118 icon.setImageDrawable(resolveInfo.loadIcon(pm)); 119 120 TextView text = (TextView) item.findViewById(R.id.secondary); 121 text.setText(resolveInfo.loadLabel(pm)); 122 123 text = (TextView) item.findViewById(R.id.primary); 124 text.setText(defaultText); 125 126 return item; 127 } 128 } 129