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 18 package com.android.development; 19 20 import com.android.development.R; 21 import android.app.Activity; 22 import android.app.ListActivity; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.content.pm.ConfigurationInfo; 26 import android.content.pm.ApplicationInfo; 27 import android.content.pm.PackageInfo; 28 import android.content.pm.PackageManager; 29 import android.content.pm.PackageManager.NameNotFoundException; 30 import android.content.res.Configuration; 31 import android.os.Bundle; 32 import android.util.Log; 33 import android.view.View; 34 import android.view.ViewGroup; 35 import android.view.LayoutInflater; 36 import android.widget.BaseAdapter; 37 import android.widget.LinearLayout; 38 import android.widget.ListView; 39 import android.widget.TextView; 40 import java.text.Collator; 41 import java.util.ArrayList; 42 import java.util.Collections; 43 import java.util.Comparator; 44 import java.util.HashSet; 45 import java.util.List; 46 47 /* This activity displays the hardware configuration details 48 * of an application as defined in its manifests 49 */ 50 public 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