1/*
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18package com.android.development;
19
20import com.android.development.R;
21import android.app.Activity;
22import android.app.ListActivity;
23import android.content.Context;
24import android.content.Intent;
25import android.content.pm.ConfigurationInfo;
26import android.content.pm.ApplicationInfo;
27import android.content.pm.PackageInfo;
28import android.content.pm.PackageManager;
29import android.content.pm.PackageManager.NameNotFoundException;
30import android.content.res.Configuration;
31import android.os.Bundle;
32import android.util.Log;
33import android.view.View;
34import android.view.ViewGroup;
35import android.view.LayoutInflater;
36import android.widget.BaseAdapter;
37import android.widget.LinearLayout;
38import android.widget.ListView;
39import android.widget.TextView;
40import java.text.Collator;
41import java.util.ArrayList;
42import java.util.Collections;
43import java.util.Comparator;
44import java.util.HashSet;
45import java.util.List;
46
47/* This activity displays the hardware configuration details
48 * of an application as defined in its manifests
49 */
50public class AppHwPref extends Activity {
51    private static final String TAG = "AppHwPref";
52    PackageManager mPm;
53    private static final int BASE = 0;
54    private static final int TOUCHSCREEN = BASE + 1;
55    private static final int KEYBOARD_TYPE = BASE + 2;
56    private static final int NAVIGATION = BASE + 3;
57    private static final int GLES_VERSION = BASE + 4;
58
59    @Override
60    protected void onCreate(Bundle icicle) {
61        super.onCreate(icicle);
62        Intent intent = getIntent();
63        String pkgName = intent.getStringExtra("packageName");
64        if(pkgName == null) {
65           handleError("Null package name", true);
66           return;
67        }
68        mPm = getPackageManager();
69        PackageInfo pInfo;
70        try {
71            pInfo = mPm.getPackageInfo(pkgName, PackageManager.GET_CONFIGURATIONS);
72        } catch (NameNotFoundException e) {
73            pInfo = null;
74        }
75        if(pInfo == null) {
76            handleError("Failed retrieving packageInfo for pkg:"+pkgName, true);
77            return;
78        }
79        ConfigurationInfo appHwPref[] = pInfo.configPreferences;
80
81        setContentView(R.layout.application_hw_pref);
82        if(appHwPref != null) {
83            displayTextView(R.id.attr_package, pInfo.applicationInfo.loadLabel(mPm));
84            displayTextView(R.id.attr_touchscreen, appHwPref, TOUCHSCREEN);
85            displayTextView(R.id.attr_input_method, appHwPref, KEYBOARD_TYPE);
86            displayTextView(R.id.attr_navigation, appHwPref, NAVIGATION);
87            displayFlag(R.id.attr_hard_keyboard, ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD, appHwPref);
88            displayFlag(R.id.attr_five_way_nav, ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV, appHwPref);
89           displayTextView(R.id.attr_gles_version, appHwPref, GLES_VERSION);
90        }
91    }
92
93    void displayFlag(int viewId, int flagMask, ConfigurationInfo[] appHwPref) {
94        if(appHwPref == null) {
95            return;
96        }
97        boolean flag = false;
98        for (int i = 0; i < appHwPref.length; i++) {
99            ConfigurationInfo pref = appHwPref[i];
100            if((pref.reqInputFeatures & flagMask) != 0) {
101                flag = true;
102                break;
103            }
104        }
105        if(flag) {
106            displayTextView(viewId, "true");
107        } else {
108            displayTextView(viewId, "false");
109        }
110    }
111
112    void handleError(String errMsg, boolean finish) {
113        // TODO display dialog
114        Log.i(TAG, errMsg);
115        if(finish) {
116            finish();
117        }
118    }
119
120    void displayTextView(int textViewId, CharSequence displayStr) {
121        TextView tView = (TextView) findViewById(textViewId);
122        if(displayStr != null) {
123            tView.setText(displayStr);
124        }
125    }
126
127    void displayTextView(int viewId, ConfigurationInfo[] config, int type) {
128        if((config == null) || (config.length < 1)) {
129            return;
130        }
131
132        HashSet<String> list = new HashSet<String>();
133        for(int i = 0; i < config.length; i++) {
134            String str = null;
135            switch(type) {
136            case TOUCHSCREEN:
137                str = getTouchScreenStr(config[i]);
138                break;
139            case KEYBOARD_TYPE:
140                str =  getKeyboardTypeStr(config[i]);
141                break;
142            case NAVIGATION:
143                str = getNavigationStr(config[i]);
144                break;
145            case GLES_VERSION:
146                str = config[i].getGlEsVersion();
147                break;
148            }
149            if(str != null) {
150                list.add(str);
151            }
152        }
153        String listStr = "";
154        boolean set = false;
155        for(String str : list) {
156            set = true;
157            listStr += str+",";
158        }
159        if(set) {
160            TextView tView = (TextView)findViewById(viewId);
161            CharSequence txt = listStr.subSequence(0, listStr.length()-1);
162            tView.setText(txt);
163        }
164    }
165
166    String getTouchScreenStr(ConfigurationInfo appHwPref) {
167        if(appHwPref == null) {
168            handleError("Invalid HardwareConfigurationObject", true);
169            return null;
170        }
171        switch(appHwPref.reqTouchScreen) {
172        case Configuration.TOUCHSCREEN_FINGER:
173            return "finger";
174        case Configuration.TOUCHSCREEN_NOTOUCH:
175            return "notouch";
176        case Configuration.TOUCHSCREEN_STYLUS:
177            return "stylus";
178        case Configuration.TOUCHSCREEN_UNDEFINED:
179            return null;
180        default:
181                return null;
182        }
183    }
184
185    String getKeyboardTypeStr(ConfigurationInfo appHwPref) {
186        if(appHwPref == null) {
187            handleError("Invalid HardwareConfigurationObject", true);
188            return null;
189        }
190        switch(appHwPref.reqKeyboardType) {
191        case Configuration.KEYBOARD_12KEY:
192            return "12key";
193        case Configuration.KEYBOARD_NOKEYS:
194            return "nokeys";
195        case Configuration.KEYBOARD_QWERTY:
196            return "querty";
197        case Configuration.KEYBOARD_UNDEFINED:
198            return null;
199        default:
200                return null;
201        }
202    }
203
204    String getNavigationStr(ConfigurationInfo appHwPref) {
205        if(appHwPref == null) {
206            handleError("Invalid HardwareConfigurationObject", true);
207            return null;
208        }
209        switch(appHwPref.reqNavigation) {
210        case Configuration.NAVIGATION_DPAD:
211            return "dpad";
212        case Configuration.NAVIGATION_TRACKBALL:
213            return "trackball";
214        case Configuration.NAVIGATION_WHEEL:
215            return "wheel";
216        case Configuration.NAVIGATION_UNDEFINED:
217            return null;
218        default:
219                return null;
220        }
221    }
222
223    @Override
224    protected void onResume() {
225        super.onResume();
226    }
227
228    @Override
229    protected void onStop() {
230        super.onStop();
231    }
232}
233
234