13da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton/* 23da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Copyright (C) 2010 The Android Open Source Project 33da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * 43da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 53da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * you may not use this file except in compliance with the License. 63da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * You may obtain a copy of the License at 73da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * 83da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 93da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * 103da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Unless required by applicable law or agreed to in writing, software 113da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 123da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * See the License for the specific language governing permissions and 143da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * limitations under the License 153da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton */ 163da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 173da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonpackage com.android.apps.tag.record; 183da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 193da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport com.android.apps.tag.R; 2040d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parksimport com.google.common.collect.Lists; 213da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 223da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.app.Activity; 233da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.content.ComponentName; 243da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.content.Intent; 253da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.content.pm.ActivityInfo; 263da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.content.pm.PackageManager; 273da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.content.pm.ResolveInfo; 2840d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parksimport android.util.Log; 293da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.view.LayoutInflater; 303da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.view.View; 313da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.view.View.OnClickListener; 323da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.view.ViewGroup; 333da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.view.ViewGroup.LayoutParams; 343da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.widget.ImageView; 353da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.widget.LinearLayout; 363da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport android.widget.TextView; 373da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 3840d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parksimport java.util.Collections; 3940d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parksimport java.util.Comparator; 403da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonimport java.util.List; 413da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 423da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton/** 433da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Utilities for parsed records to use. 443da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton */ 453da1ea5658992857304ecc0bda0d079327580f02Jeff Hamiltonpublic class RecordUtils { 463da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton /** 473da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Contains info for click events that happen on views created via {@link #getViewsForIntent}. 483da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton */ 493da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton public static final class ClickInfo { 503da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton public Activity activity; 513da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton public Intent intent; 523da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 533da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton public ClickInfo(Activity activity, Intent intent) { 543da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton this.activity = activity; 553da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton this.intent = intent; 563da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 573da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 583da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 593da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton /** 603da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Creates one or more views for a parsed record that wants to display an actionable intent. 613da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * The views will have a {@link ClickInfo} set as their tag. 623da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton */ 633da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton public static View getViewsForIntent(Activity activity, LayoutInflater inflater, 643da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton ViewGroup parent, OnClickListener listener, Intent intent, String description) { 653da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton // Lookup which packages can handle this intent. 663da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton PackageManager pm = activity.getPackageManager(); 6740d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks int flags = PackageManager.GET_RESOLVED_FILTER | PackageManager.MATCH_DEFAULT_ONLY; 6840d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks List<ResolveInfo> activities = pm.queryIntentActivities(intent, flags); 693da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton int numActivities = activities.size(); 7040d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks if (numActivities == 0 || (numActivities == 1 && !activities.get(0).activityInfo.enabled)) { 713da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton TextView text = (TextView) inflater.inflate(R.layout.tag_text, parent, false); 723da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton text.setText(description); 733da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton return text; 743da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } else if (numActivities == 1) { 753da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton return buildActivityView(activity, activities.get(0), pm, inflater, parent, listener, 763da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton intent, description); 773da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } else { 783da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton // Build a container to hold the multiple entries 793da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton LinearLayout container = new LinearLayout(activity); 803da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton container.setOrientation(LinearLayout.VERTICAL); 813da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton container.setLayoutParams(new LayoutParams( 823da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 833da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 843da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton // Create an entry for each activity that can handle the URI 853da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton for (ResolveInfo resolveInfo : activities) { 8640d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks if (!resolveInfo.activityInfo.enabled) { 8740d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks continue; 8840d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks } 8940d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks 903da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton if (container.getChildCount() > 0) { 913da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton inflater.inflate(R.layout.tag_divider, container); 923da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 9340d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks // Clone the intent for each view so they can each have their own components setup 9440d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks Intent clone = new Intent(intent); 953da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton container.addView(buildActivityView(activity, resolveInfo, pm, inflater, container, 9640d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks listener, clone, description)); 973da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 983da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton return container; 993da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 1003da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 1013da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 1023da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton /** 1033da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton * Build a view to display a single activity that can handle this URI. 1043da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton */ 1053da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton private static View buildActivityView(Activity activity, ResolveInfo resolveInfo, PackageManager pm, 1063da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton LayoutInflater inflater, ViewGroup parent, OnClickListener listener, Intent intent, 1073da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton String defaultText) { 1083da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton ActivityInfo activityInfo = resolveInfo.activityInfo; 10940d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks 11040d9a0cd0a37d184ee737b2d7138a39e4292ce3eJason parks intent.setAction(resolveInfo.filter.getAction(0)); 1113da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton intent.setComponent(new ComponentName(activityInfo.packageName, activityInfo.name)); 1123da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 1133da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton View item = inflater.inflate(R.layout.tag_uri, parent, false); 1143da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton item.setOnClickListener(listener); 1153da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton item.setTag(new ClickInfo(activity, intent)); 1163da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 1173da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton ImageView icon = (ImageView) item.findViewById(R.id.icon); 1183da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton icon.setImageDrawable(resolveInfo.loadIcon(pm)); 1193da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 1203da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton TextView text = (TextView) item.findViewById(R.id.secondary); 1213da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton text.setText(resolveInfo.loadLabel(pm)); 1223da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 1233da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton text = (TextView) item.findViewById(R.id.primary); 1243da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton text.setText(defaultText); 1253da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton 1263da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton return item; 1273da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton } 1283da1ea5658992857304ecc0bda0d079327580f02Jeff Hamilton} 129