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