1/**
2 * Copyright (C) 2007 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy
6 * 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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16
17package com.android.settings;
18
19import android.content.Context;
20import android.content.Intent;
21import android.content.pm.ApplicationInfo;
22import android.content.pm.PackageManager;
23import android.content.pm.ResolveInfo;
24import android.os.SystemProperties;
25import android.preference.Preference;
26import android.preference.PreferenceGroup;
27
28import java.util.List;
29
30public class Utils {
31
32    /**
33     * Set the preference's title to the matching activity's label.
34     */
35    public static final int UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY = 1;
36
37    /**
38     * Finds a matching activity for a preference's intent. If a matching
39     * activity is not found, it will remove the preference.
40     *
41     * @param context The context.
42     * @param parentPreferenceGroup The preference group that contains the
43     *            preference whose intent is being resolved.
44     * @param preferenceKey The key of the preference whose intent is being
45     *            resolved.
46     * @param flags 0 or one or more of
47     *            {@link #UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY}
48     *            .
49     * @return Whether an activity was found. If false, the preference was
50     *         removed.
51     */
52    public static boolean updatePreferenceToSpecificActivityOrRemove(Context context,
53            PreferenceGroup parentPreferenceGroup, String preferenceKey, int flags) {
54
55        Preference preference = parentPreferenceGroup.findPreference(preferenceKey);
56        if (preference == null) {
57            return false;
58        }
59
60        Intent intent = preference.getIntent();
61        if (intent != null) {
62            // Find the activity that is in the system image
63            PackageManager pm = context.getPackageManager();
64            List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
65            int listSize = list.size();
66            for (int i = 0; i < listSize; i++) {
67                ResolveInfo resolveInfo = list.get(i);
68                if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)
69                        != 0) {
70
71                    // Replace the intent with this specific activity
72                    preference.setIntent(new Intent().setClassName(
73                            resolveInfo.activityInfo.packageName,
74                            resolveInfo.activityInfo.name));
75
76                    if ((flags & UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY) != 0) {
77                        // Set the preference title to the activity's label
78                        preference.setTitle(resolveInfo.loadLabel(pm));
79                    }
80
81                    return true;
82                }
83            }
84        }
85
86        // Did not find a matching activity, so remove the preference
87        parentPreferenceGroup.removePreference(preference);
88
89        return true;
90    }
91
92    /**
93     * Returns true if Monkey is running.
94     */
95    public static boolean isMonkeyRunning() {
96        return SystemProperties.getBoolean("ro.monkey", false);
97    }
98
99}
100