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 17package com.android.apps.tag.record; 18 19import com.android.apps.tag.R; 20import com.google.common.collect.Lists; 21 22import android.app.Activity; 23import android.content.ComponentName; 24import android.content.Intent; 25import android.content.pm.ActivityInfo; 26import android.content.pm.PackageManager; 27import android.content.pm.ResolveInfo; 28import android.util.Log; 29import android.view.LayoutInflater; 30import android.view.View; 31import android.view.View.OnClickListener; 32import android.view.ViewGroup; 33import android.view.ViewGroup.LayoutParams; 34import android.widget.ImageView; 35import android.widget.LinearLayout; 36import android.widget.TextView; 37 38import java.util.Collections; 39import java.util.Comparator; 40import java.util.List; 41 42/** 43 * Utilities for parsed records to use. 44 */ 45public 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 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 */ 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 */ 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