upload android base code part9

This commit is contained in:
August 2018-08-08 20:16:11 +08:00
parent 5425409085
commit 071cdf34cd
2679 changed files with 329442 additions and 0 deletions

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>DeviceConfig</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View file

@ -0,0 +1,5 @@
#Tue May 22 15:51:27 PDT 2012
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.source=1.5

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.deviceconfig"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View file

@ -0,0 +1,6 @@
This project can be run on a device to populate some default values
for a vendor device description (such as the ones found in
tools/base/files/devices.xml).
Note that some of the values must be edited afterwards, so be sure to
read the UPDATE_DEVICES.txt file in that directory.

View file

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyActivity" default="help">
<!-- The local.properties file is created and updated by the 'android' tool.
It contains the path to the SDK. It should *NOT* be checked into
Version Control Systems. -->
<property file="local.properties" />
<!-- The ant.properties file can be created by you. It is only edited by the
'android' tool to add properties to it.
This is the place to change some Ant specific build properties.
Here are some properties you may want to change/update:
source.dir
The name of the source directory. Default is 'src'.
out.dir
The name of the output directory. Default is 'bin'.
For other overridable properties, look at the beginning of the rules
files in the SDK, at tools/ant/build.xml
Properties related to the SDK location or the project target should
be updated using the 'android' tool with the 'update' action.
This file is an integral part of the build system for your
application and should be checked into Version Control Systems.
-->
<property file="ant.properties" />
<!-- The project.properties file is created and updated by the 'android'
tool, as well as ADT.
This contains project specific properties such as project target, and library
dependencies. Lower level build properties are stored in ant.properties
(or in .classpath for Eclipse projects).
This file is an integral part of the build system for your
application and should be checked into Version Control Systems. -->
<loadproperties srcFile="project.properties" />
<!-- if sdk.dir was not set from one of the property file, then
get it from the ANDROID_HOME env var. -->
<property environment="env" />
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
<isset property="env.ANDROID_HOME" />
</condition>
<!-- quick check on sdk.dir -->
<fail
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
unless="sdk.dir"
/>
<!--
Import per project custom build rules if present at the root of the project.
This is the place to put custom intermediary targets such as:
-pre-build
-pre-compile
-post-compile (This is typically used for code obfuscation.
Compiled code location: ${out.classes.absolute.dir}
If this is not done in place, override ${out.dex.input.absolute.dir})
-post-package
-post-build
-pre-clean
-->
<import file="custom_rules.xml" optional="true" />
<!-- Import the actual build file.
To customize existing targets, there are two options:
- Customize only one target:
- copy/paste the target into this file, *before* the
<import> task.
- customize it to your needs.
- Customize the whole content of build.xml
- copy/paste the content of the rules files (minus the top node)
into this file, replacing the <import> task.
- customize to your needs.
***********************
****** IMPORTANT ******
***********************
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
in order to avoid having your file be overridden by tools such as "android update project"
-->
<!-- version-tag: 1 -->
<import file="${sdk.dir}/tools/ant/build.xml" />
</project>

View file

@ -0,0 +1,20 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View file

@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-15

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View file

@ -0,0 +1,395 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:id="@+id/buttonHolder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:id="@+id/generateConfigButton"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/generate_config" />
</LinearLayout>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/buttonHolder" >
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dip" >
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#333" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#333"
android:text="Type" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#333"
android:text="Resource" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="API" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Screen Size" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/screen_size" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Screen Ratio" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/screen_long" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Screen Orientation" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/orientation" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Dock" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dock" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Night" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/night" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Density" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/density" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Touch Type" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/touch" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Keyboard State" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/keyboard_state" >
</TextView>
<TextView
android:id="@+id/keyboard_state_api"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="API" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text Input" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_input" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nav State" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nav_state" >
</TextView>
<TextView
android:id="@+id/nav_state_api"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="API" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Navigation" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/navigation" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Screen Size" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/size_api"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="API" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Version" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/version" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="xdpi" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="N/A" >
</TextView>
<TextView
android:id="@+id/xdpi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="xdpi" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ydpi" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="N/A" >
</TextView>
<TextView
android:id="@+id/ydpi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ydpi" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="scaledDensity" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="N/A" >
</TextView>
<TextView
android:id="@+id/scaled_density"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="scaledDensity" >
</TextView>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fontScale" >
</TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="N/A" >
</TextView>
<TextView
android:id="@+id/font_scale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fontScale" >
</TextView>
</TableRow>
</TableLayout>
</ScrollView>
</RelativeLayout>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="text_input">12 KEY</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="dock">CAR</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="dock">DESK</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="navigation">D-PAD</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="touch">FINGER</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="density">HIGH</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="keyboard_state">EXPOSED</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="keyboard_state">HIDDEN</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="keyboard_state">SOFT</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="orientation">LANDSCAPE</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_size">LARGE</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="density">LOW</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_long">LONG</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="density">MEDIUM</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="nav_state">EXPOSED</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="nav_state">HIDDEN</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="night">NIGHT</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="density">NODPI</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="text_input">NO KEYS</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="navigation">NO NAV</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_size">NORMAL</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_long">NOTLONG</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="night">NOTNIGHT</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="touch">NOTOUCH</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="orientation">PORTRAIT</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="text_input">QWERTY</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_size">SMALL</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="touch">STYLUS</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="navigation">TRACKBALL</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="density">TV</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">1</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">14</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">2</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">3</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">4</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">5</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">6</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">7</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">8</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="version">9</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="navigation">WHEEL</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="density">XHIGH</string>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="screen_size">XLARGE</string>
</resources>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">DeviceConfig</string>
<string name="dock">DEFAULT</string>
<string name="nav_state">DEFAULT</string>
<string name="generate_config">Generate Config</string>
<string name="type">Type</string>
<string name="resource">Resource</string>
</resources>

View file

@ -0,0 +1,673 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.deviceconfig;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.ViewConfiguration;
import android.widget.Toast;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class ConfigGenerator {
private Context mCtx;
private String mExtensions;
public static final String NS_DEVICES_XSD = "http://schemas.android.com/sdk/devices/1";
/**
* The "devices" element is the root element of this schema.
*
* It must contain one or more "device" elements that each define the
* hardware, software, and states for a given device.
*/
public static final String NODE_DEVICES = "devices";
/**
* A "device" element contains a "hardware" element, a "software" element
* for each API version it supports, and a "state" element for each possible
* state the device could be in.
*/
public static final String NODE_DEVICE = "device";
/**
* The "hardware" element contains all of the hardware information for a
* given device.
*/
public static final String NODE_HARDWARE = "hardware";
/**
* The "software" element contains all of the software information for an
* API version of the given device.
*/
public static final String NODE_SOFTWARE = "software";
/**
* The "state" element contains all of the parameters for a given state of
* the device. It's also capable of redefining hardware configurations if
* they change based on state.
*/
public static final String NODE_STATE = "state";
public static final String NODE_KEYBOARD = "keyboard";
public static final String NODE_TOUCH = "touch";
public static final String NODE_GL_EXTENSIONS = "gl-extensions";
public static final String NODE_GL_VERSION = "gl-version";
public static final String NODE_NETWORKING = "networking";
public static final String NODE_REMOVABLE_STORAGE = "removable-storage";
public static final String NODE_FLASH = "flash";
public static final String NODE_LIVE_WALLPAPER_SUPPORT = "live-wallpaper-support";
public static final String NODE_BUTTONS = "buttons";
public static final String NODE_CAMERA = "camera";
public static final String NODE_LOCATION = "location";
public static final String NODE_GPU = "gpu";
public static final String NODE_DOCK = "dock";
public static final String NODE_YDPI = "ydpi";
public static final String NODE_POWER_TYPE = "power-type";
public static final String NODE_Y_DIMENSION = "y-dimension";
public static final String NODE_SCREEN_RATIO = "screen-ratio";
public static final String NODE_NAV_STATE = "nav-state";
public static final String NODE_MIC = "mic";
public static final String NODE_RAM = "ram";
public static final String NODE_XDPI = "xdpi";
public static final String NODE_DIMENSIONS = "dimensions";
public static final String NODE_ABI = "abi";
public static final String NODE_MECHANISM = "mechanism";
public static final String NODE_MULTITOUCH = "multitouch";
public static final String NODE_NAV = "nav";
public static final String NODE_PIXEL_DENSITY = "pixel-density";
public static final String NODE_SCREEN_ORIENTATION = "screen-orientation";
public static final String NODE_AUTOFOCUS = "autofocus";
public static final String NODE_SCREEN_SIZE = "screen-size";
public static final String NODE_DESCRIPTION = "description";
public static final String NODE_BLUETOOTH_PROFILES = "bluetooth-profiles";
public static final String NODE_SCREEN = "screen";
public static final String NODE_SENSORS = "sensors";
public static final String NODE_DIAGONAL_LENGTH = "diagonal-length";
public static final String NODE_SCREEN_TYPE = "screen-type";
public static final String NODE_KEYBOARD_STATE = "keyboard-state";
public static final String NODE_X_DIMENSION = "x-dimension";
public static final String NODE_CPU = "cpu";
public static final String NODE_INTERNAL_STORAGE = "internal-storage";
public static final String NODE_NAME = "name";
public static final String NODE_MANUFACTURER = "manufacturer";
public static final String NODE_API_LEVEL = "api-level";
public static final String ATTR_DEFAULT = "default";
public static final String ATTR_UNIT = "unit";
public static final String UNIT_BYTES = "B";
public static final String UNIT_KIBIBYTES = "KiB";
public static final String UNIT_MEBIBYTES = "MiB";
public static final String UNIT_GIBIBYTES = "GiB";
public static final String UNIT_TEBIBYTES = "TiB";
public static final String LOCAL_NS = "d";
public static final String PREFIX = LOCAL_NS + ":";
private static final String TAG = "ConfigGenerator";
public ConfigGenerator(Context context, String extensions) {
mCtx = context;
mExtensions = extensions;
}
@SuppressLint("WorldReadableFiles")
public String generateConfig() {
Resources resources = mCtx.getResources();
PackageManager packageMgr = mCtx.getPackageManager();
DisplayMetrics metrics = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element devices = doc.createElement(PREFIX + NODE_DEVICES);
devices.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":xsi",
XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
devices.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + LOCAL_NS, NS_DEVICES_XSD);
doc.appendChild(devices);
Element device = doc.createElement(PREFIX + NODE_DEVICE);
devices.appendChild(device);
Element name = doc.createElement(PREFIX + NODE_NAME);
device.appendChild(name);
name.appendChild(doc.createTextNode(android.os.Build.MODEL));
Element manufacturer = doc.createElement(PREFIX + NODE_MANUFACTURER);
device.appendChild(manufacturer);
manufacturer.appendChild(doc.createTextNode(android.os.Build.MANUFACTURER));
Element hardware = doc.createElement(PREFIX + NODE_HARDWARE);
device.appendChild(hardware);
Element screen = doc.createElement(PREFIX + NODE_SCREEN);
hardware.appendChild(screen);
Element screenSize = doc.createElement(PREFIX + NODE_SCREEN_SIZE);
screen.appendChild(screenSize);
Text screenSizeText;
switch (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) {
case Configuration.SCREENLAYOUT_SIZE_SMALL:
screenSizeText = doc.createTextNode("small");
break;
case Configuration.SCREENLAYOUT_SIZE_NORMAL:
screenSizeText = doc.createTextNode("normal");
break;
case Configuration.SCREENLAYOUT_SIZE_LARGE:
screenSizeText = doc.createTextNode("large");
break;
case Configuration.SCREENLAYOUT_SIZE_XLARGE:
screenSizeText = doc.createTextNode("xlarge");
break;
default:
screenSizeText = doc.createTextNode(" ");
break;
}
screenSize.appendChild(screenSizeText);
Element diagonalLength = doc.createElement(PREFIX + NODE_DIAGONAL_LENGTH);
screen.appendChild(diagonalLength);
double xin = metrics.widthPixels / metrics.xdpi;
double yin = metrics.heightPixels / metrics.ydpi;
double diag = Math.sqrt(Math.pow(xin, 2) + Math.pow(yin, 2));
diagonalLength.appendChild(doc.createTextNode(
String.format(Locale.US, "%1$.2f", diag)));
Element pixelDensity = doc.createElement(PREFIX + NODE_PIXEL_DENSITY);
screen.appendChild(pixelDensity);
Text pixelDensityText;
switch (metrics.densityDpi) {
case DisplayMetrics.DENSITY_LOW:
pixelDensityText = doc.createTextNode("ldpi");
break;
case DisplayMetrics.DENSITY_MEDIUM:
pixelDensityText = doc.createTextNode("mdpi");
break;
case DisplayMetrics.DENSITY_TV:
pixelDensityText = doc.createTextNode("tvdpi");
break;
case DisplayMetrics.DENSITY_HIGH:
pixelDensityText = doc.createTextNode("hdpi");
break;
case DisplayMetrics.DENSITY_XHIGH:
pixelDensityText = doc.createTextNode("xhdpi");
break;
default:
pixelDensityText = doc.createTextNode(" ");
}
pixelDensity.appendChild(pixelDensityText);
Element screenRatio = doc.createElement(PREFIX + NODE_SCREEN_RATIO);
screen.appendChild(screenRatio);
Text screenRatioText;
switch (config.screenLayout & Configuration.SCREENLAYOUT_LONG_MASK) {
case Configuration.SCREENLAYOUT_LONG_YES:
screenRatioText = doc.createTextNode("long");
break;
case Configuration.SCREENLAYOUT_LONG_NO:
screenRatioText = doc.createTextNode("notlong");
break;
default:
screenRatioText = doc.createTextNode(" ");
break;
}
screenRatio.appendChild(screenRatioText);
Element dimensions = doc.createElement(PREFIX + NODE_DIMENSIONS);
screen.appendChild(dimensions);
Element xDimension = doc.createElement(PREFIX + NODE_X_DIMENSION);
dimensions.appendChild(xDimension);
xDimension.appendChild(doc.createTextNode(Integer.toString(metrics.widthPixels)));
Element yDimension = doc.createElement(PREFIX + NODE_Y_DIMENSION);
dimensions.appendChild(yDimension);
yDimension.appendChild(doc.createTextNode(Integer.toString(metrics.heightPixels)));
Element xdpi = doc.createElement(PREFIX + NODE_XDPI);
screen.appendChild(xdpi);
xdpi.appendChild(doc.createTextNode(Double.toString(metrics.xdpi)));
Element ydpi = doc.createElement(PREFIX + NODE_YDPI);
screen.appendChild(ydpi);
ydpi.appendChild(doc.createTextNode(Double.toString(metrics.ydpi)));
Element touch = doc.createElement(PREFIX + NODE_TOUCH);
screen.appendChild(touch);
Element multitouch = doc.createElement(PREFIX + NODE_MULTITOUCH);
touch.appendChild(multitouch);
Text multitouchText;
if (packageMgr
.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND)) {
multitouchText = doc.createTextNode("jazz-hands");
} else if (packageMgr
.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT)) {
multitouchText = doc.createTextNode("distinct");
} else if (packageMgr.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH)) {
multitouchText = doc.createTextNode("basic");
} else {
multitouchText = doc.createTextNode("none");
}
multitouch.appendChild(multitouchText);
Element mechanism = doc.createElement(PREFIX + NODE_MECHANISM);
touch.appendChild(mechanism);
Text mechanismText;
switch (config.touchscreen) {
case Configuration.TOUCHSCREEN_STYLUS:
mechanismText = doc.createTextNode("stylus");
case Configuration.TOUCHSCREEN_FINGER:
mechanismText = doc.createTextNode("finger");
case Configuration.TOUCHSCREEN_NOTOUCH:
mechanismText = doc.createTextNode("notouch");
default:
mechanismText = doc.createTextNode(" ");
}
mechanism.appendChild(mechanismText);
// Create an empty place holder node for screen-type since we can't
// actually determine it
Element screenType = doc.createElement(PREFIX + NODE_SCREEN_TYPE);
touch.appendChild(screenType);
screenType.appendChild(doc.createTextNode(" "));
Element networking = doc.createElement(PREFIX + NODE_NETWORKING);
hardware.appendChild(networking);
Text networkingText = doc.createTextNode("");
networking.appendChild(networkingText);
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_WIFI)) {
networkingText.appendData("\nWifi");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
networkingText.appendData("\nBluetooth");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_NFC)) {
networkingText.appendData("\nNFC");
}
Element sensors = doc.createElement(PREFIX + NODE_SENSORS);
hardware.appendChild(sensors);
Text sensorsText = doc.createTextNode("");
sensors.appendChild(sensorsText);
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)) {
sensorsText.appendData("\nAccelerometer");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_SENSOR_BAROMETER)) {
sensorsText.appendData("\nBarometer");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
sensorsText.appendData("\nCompass");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)) {
sensorsText.appendData("\nGPS");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_SENSOR_GYROSCOPE)) {
sensorsText.appendData("\nGyroscope");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_SENSOR_LIGHT)) {
sensorsText.appendData("\nLightSensor");
}
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_SENSOR_PROXIMITY)) {
sensorsText.appendData("\nProximitySensor");
}
Element mic = doc.createElement(PREFIX + NODE_MIC);
hardware.appendChild(mic);
Text micText;
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_MICROPHONE)) {
micText = doc.createTextNode("true");
} else {
micText = doc.createTextNode("false");
}
mic.appendChild(micText);
if (android.os.Build.VERSION.SDK_INT >= 9){
List<Element> cameras = getCameraElements(doc);
for (Element cam : cameras){
hardware.appendChild(cam);
}
} else {
Camera c = Camera.open();
Element camera = doc.createElement(PREFIX + NODE_CAMERA);
hardware.appendChild(camera);
Element location = doc.createElement(PREFIX + NODE_LOCATION);
camera.appendChild(location);
// All camera's before API 9 were on the back
location.appendChild(doc.createTextNode("back"));
Camera.Parameters cParams = c.getParameters();
Element autofocus = doc.createElement(PREFIX + NODE_AUTOFOCUS);
camera.appendChild(autofocus);
List<String> foci = cParams.getSupportedFocusModes();
if (foci == null) {
autofocus.appendChild(doc.createTextNode(" "));
} else if (foci.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
autofocus.appendChild(doc.createTextNode("true"));
} else {
autofocus.appendChild(doc.createTextNode("false"));
}
Element flash = doc.createElement(PREFIX + NODE_FLASH);
camera.appendChild(flash);
List<String> flashes = cParams.getSupportedFlashModes();
if (flashes == null || !flashes.contains(Camera.Parameters.FLASH_MODE_ON)) {
flash.appendChild(doc.createTextNode("false"));
} else {
flash.appendChild(doc.createTextNode("true"));
}
c.release();
}
Element keyboard = doc.createElement(PREFIX + NODE_KEYBOARD);
hardware.appendChild(keyboard);
Text keyboardText;
switch (config.keyboard) {
case Configuration.KEYBOARD_NOKEYS:
keyboardText = doc.createTextNode("nokeys");
break;
case Configuration.KEYBOARD_12KEY:
keyboardText = doc.createTextNode("12key");
break;
case Configuration.KEYBOARD_QWERTY:
keyboardText = doc.createTextNode("qwerty");
break;
default:
keyboardText = doc.createTextNode(" ");
}
keyboard.appendChild(keyboardText);
Element nav = doc.createElement(PREFIX + NODE_NAV);
hardware.appendChild(nav);
Text navText;
switch (config.navigation) {
case Configuration.NAVIGATION_DPAD:
navText = doc.createTextNode("dpad");
case Configuration.NAVIGATION_TRACKBALL:
navText = doc.createTextNode("trackball");
case Configuration.NAVIGATION_WHEEL:
navText = doc.createTextNode("wheel");
case Configuration.NAVIGATION_NONAV:
navText = doc.createTextNode("nonav");
default:
navText = doc.createTextNode(" ");
}
nav.appendChild(navText);
Element ram = doc.createElement(PREFIX + NODE_RAM);
hardware.appendChild(ram);
// totalMemory given in bytes, divide by 1048576 to get RAM in MiB
String line;
long ramAmount = 0;
String unit = UNIT_BYTES;
try {
BufferedReader meminfo = new BufferedReader(new FileReader("/proc/meminfo"));
while ((line = meminfo.readLine()) != null) {
String[] vals = line.split("[\\s]+");
if (vals[0].equals("MemTotal:")) {
try {
/*
* We're going to want it as a string eventually,
* but parsing it lets us validate it's actually a
* number and something strange isn't going on
*/
ramAmount = Long.parseLong(vals[1]);
unit = vals[2];
break;
} catch (NumberFormatException e) {
// Ignore
}
}
}
meminfo.close();
} catch (FileNotFoundException e) {
// Ignore
}
if (ramAmount > 0) {
if (unit.equals("B")) {
unit = UNIT_BYTES;
} else if (unit.equals("kB")) {
unit = UNIT_KIBIBYTES;
} else if (unit.equals("MB")) {
unit = UNIT_MEBIBYTES;
} else if (unit.equals("GB")) {
unit = UNIT_GIBIBYTES;
} else {
unit = " ";
}
}
ram.setAttribute(ATTR_UNIT, unit);
ram.appendChild(doc.createTextNode(Long.toString(ramAmount)));
Element buttons = doc.createElement(PREFIX + NODE_BUTTONS);
hardware.appendChild(buttons);
Text buttonsText;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
buttonsText = doc.createTextNode(getButtonsType());
} else {
buttonsText = doc.createTextNode("hard");
}
buttons.appendChild(buttonsText);
Element internalStorage = doc.createElement(PREFIX + NODE_INTERNAL_STORAGE);
hardware.appendChild(internalStorage);
StatFs rootStat = new StatFs(Environment.getRootDirectory().getAbsolutePath());
long bytesAvailable = rootStat.getBlockSize() * rootStat.getBlockCount();
long internalStorageSize = bytesAvailable / (1024 * 1024);
internalStorage.appendChild(doc.createTextNode(Long.toString(internalStorageSize)));
internalStorage.setAttribute(ATTR_UNIT, UNIT_MEBIBYTES);
Element externalStorage = doc.createElement(PREFIX + NODE_REMOVABLE_STORAGE);
hardware.appendChild(externalStorage);
externalStorage.appendChild(doc.createTextNode(" "));
// Don't know CPU, GPU types
Element cpu = doc.createElement(PREFIX + NODE_CPU);
hardware.appendChild(cpu);
cpu.appendChild(doc.createTextNode(" "));
Element gpu = doc.createElement(PREFIX + NODE_GPU);
hardware.appendChild(gpu);
gpu.appendChild(doc.createTextNode(" "));
Element abi = doc.createElement(PREFIX + NODE_ABI);
hardware.appendChild(abi);
Text abiText = doc.createTextNode("");
abi.appendChild(abiText);
abiText.appendData("\n" + android.os.Build.CPU_ABI);
abiText.appendData("\n" + android.os.Build.CPU_ABI2);
// Don't know about either the dock or plugged-in element
Element dock = doc.createElement(PREFIX + NODE_DOCK);
hardware.appendChild(dock);
dock.appendChild(doc.createTextNode(" "));
Element pluggedIn = doc.createElement(PREFIX + NODE_POWER_TYPE);
hardware.appendChild(pluggedIn);
pluggedIn.appendChild(doc.createTextNode(" "));
Element software = doc.createElement(PREFIX + NODE_SOFTWARE);
device.appendChild(software);
Element apiLevel = doc.createElement(PREFIX + NODE_API_LEVEL);
software.appendChild(apiLevel);
apiLevel.appendChild(doc.createTextNode(Integer
.toString(android.os.Build.VERSION.SDK_INT)));
Element liveWallpaperSupport = doc.createElement(PREFIX + NODE_LIVE_WALLPAPER_SUPPORT);
software.appendChild(liveWallpaperSupport);
if (packageMgr.hasSystemFeature(PackageManager.FEATURE_LIVE_WALLPAPER)) {
liveWallpaperSupport.appendChild(doc.createTextNode("true"));
} else {
liveWallpaperSupport.appendChild(doc.createTextNode("flase"));
}
Element bluetoothProfiles = doc.createElement(PREFIX + NODE_BLUETOOTH_PROFILES);
software.appendChild(bluetoothProfiles);
bluetoothProfiles.appendChild(doc.createTextNode(" "));
Element glVersion = doc.createElement(PREFIX + NODE_GL_VERSION);
software.appendChild(glVersion);
String glVersionString = " ";
FeatureInfo[] features = packageMgr.getSystemAvailableFeatures();
for (FeatureInfo feature : features) {
if (feature.reqGlEsVersion > 0) {
glVersionString = feature.getGlEsVersion();
break;
}
}
glVersion.appendChild(doc.createTextNode(glVersionString));
Element glExtensions = doc.createElement(PREFIX + NODE_GL_EXTENSIONS);
software.appendChild(glExtensions);
if (mExtensions != null && !mExtensions.trim().equals("")) {
glExtensions.appendChild(doc.createTextNode(mExtensions));
} else {
glExtensions.appendChild(doc.createTextNode(" "));
}
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
DOMSource source = new DOMSource(doc);
String filename = String.format("devices_%1$tm_%1$td_%1$ty.xml", Calendar.getInstance()
.getTime());
File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File outFile = new File(dir, filename);
FileOutputStream out = new FileOutputStream(new File(dir, filename));
StreamResult result = new StreamResult(out);
tf.transform(source, result);
out.flush();
out.close();
return outFile.getAbsolutePath();
} catch (ParserConfigurationException e) {
error("Parser config exception", e);
} catch (TransformerConfigurationException e) {
error("Transformer config exception", e);
} catch (TransformerFactoryConfigurationError e) {
error("TransformerFactory config exception", e);
} catch (TransformerException e) {
error("Error transforming", e);
} catch (IOException e) {
error("I/O Error", e);
}
return null;
}
@TargetApi(9)
private List<Element> getCameraElements(Document doc) {
List<Element> cList = new ArrayList<Element>();
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Element camera = doc.createElement(PREFIX + NODE_CAMERA);
cList.add(camera);
Element location = doc.createElement(PREFIX + NODE_LOCATION);
camera.appendChild(location);
Text locationText;
Camera.CameraInfo cInfo = new Camera.CameraInfo();
Camera.getCameraInfo(i, cInfo);
if (cInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
locationText = doc.createTextNode("front");
} else if (cInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
locationText = doc.createTextNode("back");
} else {
locationText = doc.createTextNode(" ");
}
location.appendChild(locationText);
Camera c = Camera.open(i);
Camera.Parameters cParams = c.getParameters();
Element autofocus = doc.createElement(PREFIX + NODE_AUTOFOCUS);
camera.appendChild(autofocus);
List<String> foci = cParams.getSupportedFocusModes();
if (foci == null) {
autofocus.appendChild(doc.createTextNode(" "));
} else if (foci.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
autofocus.appendChild(doc.createTextNode("true"));
} else {
autofocus.appendChild(doc.createTextNode("false"));
}
Element flash = doc.createElement(PREFIX + NODE_FLASH);
camera.appendChild(flash);
List<String> flashes = cParams.getSupportedFlashModes();
if (flashes == null || !flashes.contains(Camera.Parameters.FLASH_MODE_ON)) {
flash.appendChild(doc.createTextNode("false"));
} else {
flash.appendChild(doc.createTextNode("true"));
}
c.release();
}
return cList;
}
@TargetApi(14)
private String getButtonsType() {
ViewConfiguration vConfig = ViewConfiguration.get(mCtx);
if (vConfig.hasPermanentMenuKey()) {
return "hard";
} else {
return "soft";
}
}
private void error(String err, Throwable e) {
Toast.makeText(mCtx, "Error Generating Configuration", Toast.LENGTH_SHORT).show();
Log.e(TAG, err);
Log.e(TAG, e.getLocalizedMessage());
}
}

View file

@ -0,0 +1,186 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.deviceconfig;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.File;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class MyActivity extends Activity implements OnClickListener {
public static final String TAG = "DeviceConfig";
private static GLView mGl;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Instantiate a GL surface view so we can get extensions information
mGl = new GLView(this);
LinearLayout vg = (LinearLayout) findViewById(R.id.buttonHolder);
// If we set the layout to be 0, it just won't render
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(1, 1);
mGl.setLayoutParams(params);
vg.addView(mGl);
Button btn = (Button) findViewById(R.id.generateConfigButton);
btn.setOnClickListener(this);
Configuration config = getResources().getConfiguration();
TextView tv = (TextView) findViewById(R.id.keyboard_state_api);
if (tv != null) {
String separator = config.orientation == Configuration.ORIENTATION_PORTRAIT ? "\n" : "";
String foo = "keyboardHidden=" + separator;
if (config.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {
foo += "EXPOSED";
} else if (config.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
foo += "HIDDEN";
} else if (config.keyboardHidden == Configuration.KEYBOARDHIDDEN_UNDEFINED) {
foo += "UNDEFINED";
} else {
foo += "?";
}
foo += "\nhardKeyboardHidden=" + separator;
if (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
foo = foo + "EXPOSED";
} else if (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
foo = foo + "HIDDEN";
} else if (config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_UNDEFINED) {
foo = foo + "UNDEFINED";
} else {
foo = "?";
}
tv.setText(foo);
}
tv = (TextView) findViewById(R.id.nav_state_api);
if (tv != null) {
if (config.navigationHidden == Configuration.NAVIGATIONHIDDEN_NO) {
tv.setText("EXPOSED");
} else if (config.navigationHidden == Configuration.NAVIGATIONHIDDEN_YES) {
tv.setText("HIDDEN");
} else if (config.navigationHidden == Configuration.NAVIGATIONHIDDEN_UNDEFINED) {
tv.setText("UNDEFINED");
} else {
tv.setText("??");
}
}
DisplayMetrics metrics = getResources().getDisplayMetrics();
tv = (TextView) findViewById(R.id.size_api);
if (tv != null) {
int a = metrics.heightPixels;
int b = metrics.widthPixels;
tv.setText(b + "x" + a);
}
tv = (TextView) findViewById(R.id.xdpi);
if (tv != null) {
tv.setText(String.format("%f", metrics.xdpi));
}
tv = (TextView) findViewById(R.id.ydpi);
if (tv != null) {
tv.setText(String.format("%f", metrics.ydpi));
}
tv = (TextView) findViewById(R.id.scaled_density);
if (tv != null) {
tv.setText(String.format("%f", metrics.scaledDensity));
}
tv = (TextView) findViewById(R.id.font_scale);
if (tv != null) {
tv.setText(String.format("%f", config.fontScale));
}
}
public void onClick(View v) {
ConfigGenerator configGen = new ConfigGenerator(this, mGl.getExtensions());
final String filename = configGen.generateConfig();
if (filename != null) {
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("text/xml");
File devicesXml = new File(filename);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Device XML: " + devicesXml.getName());
emailIntent.putExtra(Intent.EXTRA_TEXT, "Note: This is intended to generate a base "
+ "XML description. After running this, you should double check the generated "
+ "information and add all of the missing fields.");
emailIntent.putExtra(Intent.EXTRA_STREAM,
Uri.parse("file://" + devicesXml.getAbsolutePath()));
startActivity(emailIntent);
}
}
private static class GLView extends GLSurfaceView {
private GlRenderer mRenderer;
public GLView(Context context) {
super(context);
setEGLContextClientVersion(2);
mRenderer = new GlRenderer();
setRenderer(mRenderer);
requestRender();
}
public String getExtensions() {
return mRenderer.extensions;
}
}
private static class GlRenderer implements GLSurfaceView.Renderer {
public String extensions = "";
public void onDrawFrame(GL10 gl) {
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, 0, 0);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
if (extensions.equals("")) {
String extensions10 = gl.glGetString(GL10.GL_EXTENSIONS);
if(extensions10 != null) {
extensions += extensions10;
}
}
}
}
}