auto import from //depot/cupcake/@135843
diff --git a/apps/Development/Android.mk b/apps/Development/Android.mk
new file mode 100644
index 0000000..9578e79
--- /dev/null
+++ b/apps/Development/Android.mk
@@ -0,0 +1,15 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := eng development tests
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_STATIC_JAVA_LIBRARIES := googlelogin-client
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files) \
+ src/com/android/development/IRemoteService.aidl \
+
+LOCAL_PACKAGE_NAME := Development
+LOCAL_CERTIFICATE := platform
+
+include $(BUILD_PACKAGE)
diff --git a/apps/Development/AndroidManifest.xml b/apps/Development/AndroidManifest.xml
new file mode 100644
index 0000000..879e7d6
--- /dev/null
+++ b/apps/Development/AndroidManifest.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.development"
+ android:versionCode="1" android:versionName="1.0">
+ <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+ <uses-permission android:name="android.permission.DUMP" />
+ <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
+ <uses-permission android:name="android.permission.RESTART_PACKAGES" />
+ <uses-permission android:name="android.permission.SET_ANIMATION_SCALE" />
+ <uses-permission android:name="android.permission.SET_PROCESS_LIMIT" />
+ <uses-permission android:name="android.permission.SET_ALWAYS_FINISH" />
+ <uses-permission android:name="android.permission.SET_DEBUG_APP" />
+ <uses-permission android:name="android.permission.HARDWARE_TEST" />
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
+ <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.ALL_SERVICES" />
+ <uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH.YouTubeUser" />
+ <uses-permission android:name="com.google.android.googleapps.permission.ACCESS_GOOGLE_PASSWORD" />
+
+ <application android:label="Dev Tools"
+ android:icon="@drawable/ic_launcher_devtools">
+
+ <uses-library android:name="android.test.runner" />
+ <uses-library android:name="com.google.android.maps" />
+
+ <activity android:name="Development" android:label="Dev Tools"
+ android:icon="@drawable/ic_launcher_devtools">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name="PackageBrowser" android:label="Package Browser">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+ <activity android:name="ExceptionBrowser" android:label="Exception Browser">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+ <activity android:name="StacktraceViewer" android:label="Stacktrace Viewer"/>
+ <activity android:name="PackageSummary" android:label="Package Summary">
+ </activity>
+ <activity android:name="ShowActivity" android:label="Activity">
+ </activity>
+ <activity android:name="AppPicker"
+ android:theme="@android:style/Theme.Dialog">
+ </activity>
+ <activity android:name="PointerLocation" android:label="Pointer Location"
+ android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
+ android:configChanges="keyboard|keyboardHidden|navigation|orientation">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="DataList">
+ </activity>
+ <activity android:name="Details">
+ </activity>
+ <activity android:name="DevelopmentSettings" android:label="Development Settings" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="InstrumentationList" android:label="Instrumentation">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="MediaScannerActivity" android:label="Media Scanner">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="GLSTester" android:label="Google Login Service">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name="RunningProcesses" android:label="Running processes">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+ <activity android:name="ProcessInfo" android:label="Process Information">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+ <!--
+ <activity android:name="AppHwConfigList" android:label="Applications Hw Configuration">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.TEST" />
+ </intent-filter>
+ </activity>
+ -->
+ <activity android:name="AppHwPref" android:label="Applications Hardware Preferences">
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/apps/Development/res/drawable/box.xml b/apps/Development/res/drawable/box.xml
new file mode 100644
index 0000000..6849bd3
--- /dev/null
+++ b/apps/Development/res/drawable/box.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/res/drawable/box.xml
+**
+** Copyright 2007, 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.
+*/
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#00000000"/>
+ <stroke android:width="1dp" color="#ff000000"/>
+ <padding android:left="1dp" android:top="1dp"
+ android:right="1dp" android:bottom="1dp" />
+</shape>
diff --git a/apps/Development/res/drawable/ic_launcher_devtools.png b/apps/Development/res/drawable/ic_launcher_devtools.png
new file mode 100644
index 0000000..cb40a19
--- /dev/null
+++ b/apps/Development/res/drawable/ic_launcher_devtools.png
Binary files differ
diff --git a/apps/Development/res/drawable/stat_sample.png b/apps/Development/res/drawable/stat_sample.png
new file mode 100644
index 0000000..a2e5ce3
--- /dev/null
+++ b/apps/Development/res/drawable/stat_sample.png
Binary files differ
diff --git a/apps/Development/res/layout/application_hw_pref.xml b/apps/Development/res/layout/application_hw_pref.xml
new file mode 100755
index 0000000..859c7ab
--- /dev/null
+++ b/apps/Development/res/layout/application_hw_pref.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="4dip" >
+
+ <TextView android:id="@+id/attr_package_label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/package_label"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/attr_package"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/attr_touchscreen_label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/touchscreen_label"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/attr_touchscreen"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/attr_input_method_label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/input_method_label"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/attr_input_method"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/attr_hard_keyboard_label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/hard_keyboard_label"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/attr_hard_keyboard"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/attr_navigation_label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/navigation_label"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/attr_navigation"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+
+ <TextView android:id="@+id/attr_five_way_nav_label"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/five_way_nav_label"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/attr_five_way_nav"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"/>
+ </LinearLayout>
+</ScrollView>
+
diff --git a/apps/Development/res/layout/development_settings.xml b/apps/Development/res/layout/development_settings.xml
new file mode 100644
index 0000000..0486748
--- /dev/null
+++ b/apps/Development/res/layout/development_settings.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/assets/res/any/layout/keyboard_version.xml
+**
+** Copyright 2006, 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.
+*/
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <TextView android:id="@+id/debug_app_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_debug_app_label_text" />
+
+ <Button android:id="@+id/debug_app"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/debug_app_label"
+ android:layout_alignParentLeft="true"
+ android:layout_toRightOf="@id/debug_app_label" />
+
+ <!-- android:visibility="gone" -->
+
+ <CheckBox android:id="@+id/wait_for_debugger"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/debug_app"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_wait_for_debugger_text" />
+
+ <View android:id="@+id/separator"
+ android:layout_width="8dip"
+ android:layout_height="8dip"
+ android:layout_below="@id/wait_for_debugger"
+ android:layout_alignParentLeft="true" />
+
+ <CheckBox android:id="@+id/show_load"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/separator"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_load_text" />
+
+ <CheckBox android:id="@+id/show_updates"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/show_load"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_updates_text" />
+
+ <Spinner android:id="@+id/max_procs"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/show_updates"
+ android:layout_alignParentLeft="true" />
+
+ <View android:id="@+id/separator2"
+ android:layout_width="8dip"
+ android:layout_height="8dip"
+ android:layout_below="@id/max_procs"
+ android:layout_alignParentLeft="true" />
+
+ <CheckBox android:id="@+id/always_finish"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/separator2"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_always_finish_text" />
+
+ <CheckBox android:id="@+id/show_cpu"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/always_finish"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_cpu_text" />
+
+ <CheckBox android:id="@+id/enable_gl"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/show_cpu"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_enable_gl_text" />
+
+ <CheckBox android:id="@+id/show_background"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/enable_gl"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_background_text" />
+
+ <CheckBox android:id="@+id/show_sleep"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/show_background"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_sleep_text" />
+
+ <Spinner android:id="@+id/window_animation_scale"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/show_sleep"
+ android:layout_alignParentLeft="true">
+ </Spinner>
+
+ <Spinner android:id="@+id/transition_animation_scale"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/window_animation_scale"
+ android:layout_alignParentLeft="true">
+ </Spinner>
+
+ <Spinner android:id="@+id/font_hinting"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/transition_animation_scale"
+ android:layout_alignParentLeft="true">
+ </Spinner>
+
+ <CheckBox android:id="@+id/show_xmpp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/font_hinting"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_xmpp_text" />
+
+ <CheckBox android:id="@+id/show_maps_compass"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/show_xmpp"
+ android:layout_alignParentLeft="true"
+ android:text="@string/development_settings_show_maps_compass_text" />
+
+ </RelativeLayout>
+
+</ScrollView>
+
diff --git a/apps/Development/res/layout/enter_url.xml b/apps/Development/res/layout/enter_url.xml
new file mode 100644
index 0000000..062c67e
--- /dev/null
+++ b/apps/Development/res/layout/enter_url.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
+ android:layout_width="fill_parent" android:layout_height="fill_parent">
+ <com.android.development.UrlEditText android:id="@+id/url_edit_text"
+ android:textSize="13sp"
+ android:autoText="false"
+ android:capitalize="none"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"/>
+ <com.android.development.DisplayEditText android:id="@+id/display_edit_text"
+ android:textSize="13sp"
+ android:autoText="false"
+ android:capitalize="none"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"/>
+ <ListView android:id="@android:id/list"
+ android:layout_width="fill_parent" android:layout_height="fill_parent"/>
+</LinearLayout>
+
+
diff --git a/apps/Development/res/layout/gls_tester.xml b/apps/Development/res/layout/gls_tester.xml
new file mode 100644
index 0000000..fbd4549
--- /dev/null
+++ b/apps/Development/res/layout/gls_tester.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/prefer_hosted"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_prefer_hosted"/>
+
+ <Button
+ android:id="@+id/require_google"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_require_google"/>
+
+ <Button
+ android:id="@+id/get_accounts"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_get_accounts"/>
+
+ <Button
+ android:id="@+id/clear"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_clear"/>
+
+ <Button android:id="@+id/go"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_go"/>
+
+ </LinearLayout>
+
+ <EditText android:id="@+id/username_edit"
+ android:singleLine="true"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:minWidth="250dip"
+ android:scrollHorizontally="true"
+ android:capitalize="none"
+ android:autoText="false"/>
+
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <CheckBox android:id="@+id/do_notification"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_do_notification"/>
+
+ <CheckBox android:id="@+id/run_intent"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_run_intent"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <Spinner android:id="@+id/service_spinner"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:entries="@array/glstester_services"/>
+
+ <Button
+ android:id="@+id/wipe_passwords"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/gls_tester_wipe_passwords"/>
+ </LinearLayout>
+
+ <com.android.development.LogTextBox
+ android:id="@+id/text"
+ android:background="@drawable/box"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1"
+ android:scrollbars="vertical"
+ android:textSize="10dip"
+ />
+
+</LinearLayout>
diff --git a/apps/Development/res/layout/log_viewer.xml b/apps/Development/res/layout/log_viewer.xml
new file mode 100644
index 0000000..98fe14e
--- /dev/null
+++ b/apps/Development/res/layout/log_viewer.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<com.android.development.LogTextBox xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ />
diff --git a/apps/Development/res/layout/media_scanner_activity.xml b/apps/Development/res/layout/media_scanner_activity.xml
new file mode 100644
index 0000000..53f2b15
--- /dev/null
+++ b/apps/Development/res/layout/media_scanner_activity.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="horizontal">
+
+ <TextView android:id="@+id/title" android:textSize="16sp" android:textStyle="bold"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+</LinearLayout>
diff --git a/apps/Development/res/layout/monkey_screen.xml b/apps/Development/res/layout/monkey_screen.xml
new file mode 100644
index 0000000..c508338
--- /dev/null
+++ b/apps/Development/res/layout/monkey_screen.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="10dip" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip"
+ android:text="@string/monkey_screen_initial_activity_label" />
+
+ <Button android:id="@+id/initialActivity"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/monkey_screen_initialActivity_text" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="5dip" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingRight="5dip"
+ android:text="@string/monkey_screen_number_of_events_label" />
+
+ <EditText android:id="@+id/numberOfEvents"
+ android:layout_marginLeft="2dip"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:drawable/editbox_background"
+ android:numeric="integer"
+ android:scrollHorizontally="true"
+ android:maxLines="1" />
+ </LinearLayout>
+
+ <Button android:id="@+id/start"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="10dip"
+ android:text="@string/monkey_screen_start_text" />
+
+</LinearLayout>
+
+
diff --git a/apps/Development/res/layout/package_item.xml b/apps/Development/res/layout/package_item.xml
new file mode 100644
index 0000000..7860f9b
--- /dev/null
+++ b/apps/Development/res/layout/package_item.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<Button xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <!--android:background="@android:drawable/list_highlight"-->
diff --git a/apps/Development/res/layout/package_summary.xml b/apps/Development/res/layout/package_summary.xml
new file mode 100644
index 0000000..99717e6
--- /dev/null
+++ b/apps/Development/res/layout/package_summary.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="4dip" >
+
+ <TextView android:id="@+id/packageView"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" />
+
+ <LinearLayout
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingTop="4dip"
+ android:paddingBottom="6dip"
+ android:paddingRight="4dip" >
+
+ <ImageView android:id="@+id/icon"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:paddingRight="8dip" />
+
+ <LinearLayout
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/classView"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView android:id="@+id/label"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView android:id="@+id/disabled"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:text="@string/disabled" />
+
+ <TextView android:id="@+id/system"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:text="@string/system" />
+
+ <TextView android:id="@+id/debuggable"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:text="@string/debuggable" />
+
+ <TextView android:id="@+id/nocode"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:text="@string/nocode" />
+
+ <TextView android:id="@+id/persistent"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:text="@string/persistent" />
+
+ </LinearLayout>
+
+ <Button android:id="@+id/restart"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:text="@string/restart" />
+
+ </LinearLayout>
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/package_summary_process_label" />
+
+ <TextView android:id="@+id/process"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/package_summary_uid_label" />
+
+ <TextView android:id="@+id/uid"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/package_summary_task_label" />
+
+ <TextView android:id="@+id/task"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/package_summary_version_label" />
+
+ <TextView android:id="@+id/version"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/package_summary_source_label" />
+
+ <TextView android:id="@+id/source"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/package_summary_data_label" />
+
+ <TextView android:id="@+id/data"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <LinearLayout android:id="@+id/activities" style="@style/SummaryCategoryLayout">
+ <TextView style="@style/SummaryCategoryHeader"
+ android:text="@string/package_summary_activities_label" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/receivers" style="@style/SummaryCategoryLayout">
+ <TextView style="@style/SummaryCategoryHeader"
+ android:text="@string/package_summary_receivers_label" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/services" style="@style/SummaryCategoryLayout">
+ <TextView style="@style/SummaryCategoryHeader"
+ android:text="@string/package_summary_services_label" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/providers" style="@style/SummaryCategoryLayout">
+ <TextView style="@style/SummaryCategoryHeader"
+ android:text="@string/package_summary_providers_label" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/instrumentation" style="@style/SummaryCategoryLayout">
+ <TextView style="@style/SummaryCategoryHeader"
+ android:text="@string/package_summary_instrumentation_label" />
+ </LinearLayout>
+
+ </LinearLayout>
+</ScrollView>
+
diff --git a/apps/Development/res/layout/process_info.xml b/apps/Development/res/layout/process_info.xml
new file mode 100755
index 0000000..b25f223
--- /dev/null
+++ b/apps/Development/res/layout/process_info.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:padding="4dip" >
+
+ <TextView android:id="@+id/process_name_header"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/process_name_header"
+ android:textStyle="bold" />
+ <TextView android:id="@+id/process_name"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+ <TextView android:id="@+id/package_list_header"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/package_list_header"
+ android:textStyle="bold" />
+
+ <LinearLayout android:id="@+id/package_list"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:paddingTop="4dip"
+ android:paddingBottom="6dip"
+ android:paddingRight="4dip" />
+
+ </LinearLayout>
+</ScrollView>
+
diff --git a/apps/Development/res/layout/radio_issue.xml b/apps/Development/res/layout/radio_issue.xml
new file mode 100644
index 0000000..b13b6bb
--- /dev/null
+++ b/apps/Development/res/layout/radio_issue.xml
@@ -0,0 +1,49 @@
+<!--
+**
+** Copyright 2007, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Button android:id="@+id/submit"
+ android:textSize="14sp"
+ android:layout_marginTop="8dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:text="@string/radio_issue_submit_text"
+ />
+ <TextView android:id="@+id/instructions"
+ android:textSize="14sp"
+ android:layout_marginTop="10dip"
+ android:layout_marginLeft="4dip"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:text="@string/radio_issue_instructions_text"
+ />
+
+ </LinearLayout>
+
+ <EditText android:id="@+id/report_text"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:textSize="14sp"
+ />
+
+</LinearLayout>
diff --git a/apps/Development/res/layout/show_activity.xml b/apps/Development/res/layout/show_activity.xml
new file mode 100644
index 0000000..6a7617c
--- /dev/null
+++ b/apps/Development/res/layout/show_activity.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/Settings/res/layout/keyguard.xml
+**
+** Copyright 2007, 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.
+*/
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <LinearLayout
+ android:layout_width="fill_parent" android:layout_height="fill_parent"
+ android:orientation="vertical"
+ android:paddingTop="8dip" android:paddingLeft="2dip" android:paddingRight="2dip" >
+
+ <TextView android:id="@+id/packageView"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" />
+
+ <LinearLayout
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingTop="4dip"
+ android:paddingBottom="6dip" >
+
+ <ImageView android:id="@+id/icon"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:paddingRight="8dip" />
+
+ <LinearLayout
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <TextView android:id="@+id/classView"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView android:id="@+id/label"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView android:id="@+id/launch"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/show_activity_process_label" />
+
+ <TextView android:id="@+id/process"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/show_activity_task_affinity_label" />
+
+ <TextView android:id="@+id/taskAffinity"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/show_activity_required_permission_label" />
+
+ <TextView android:id="@+id/permission"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/show_activity_multiprocess_label" />
+
+ <TextView android:id="@+id/multiprocess"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/show_activity_clear_on_background_label" />
+
+ <TextView android:id="@+id/clearOnBackground"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ <TextView style="@style/SummaryCategoryLayout"
+ android:layout_width="fill_parent" android:layout_height="wrap_content"
+ android:textStyle="bold" android:text="@string/show_activity_state_not_needed_label" />
+
+ <TextView android:id="@+id/stateNotNeeded"
+ android:layout_width="fill_parent" android:layout_height="wrap_content" />
+
+ </LinearLayout>
+
+</ScrollView>
+
diff --git a/apps/Development/res/layout/url_list.xml b/apps/Development/res/layout/url_list.xml
new file mode 100644
index 0000000..f004eff
--- /dev/null
+++ b/apps/Development/res/layout/url_list.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:textColor="#FF000000"
+ android:textSize="13sp"
+ android:maxLines="1" />
diff --git a/apps/Development/res/values/arrays.xml b/apps/Development/res/values/arrays.xml
new file mode 100644
index 0000000..cb38127
--- /dev/null
+++ b/apps/Development/res/values/arrays.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources>
+ <string-array name="glstester_services">
+ <item>mail</item>
+ <item>SID</item>
+ <item>LSID</item>
+ <item>youtube</item>
+ <item>YouTubeUser</item>
+ <item>sierra</item>
+ <item>lh2</item>
+ <item>cl</item>
+ <item>cp</item>
+ </string-array>
+</resources>
+
+
diff --git a/apps/Development/res/values/strings.xml b/apps/Development/res/values/strings.xml
new file mode 100644
index 0000000..8d343ae
--- /dev/null
+++ b/apps/Development/res/values/strings.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, 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.
+*/
+-->
+<resources>
+ <string name="menu_upload_exceptions">Upload Exceptions</string>
+ <string name="menu_clear_exceptions">Clear Exceptions</string>
+
+ <string name="device_info_default">unknown</string>
+ <string name="device_info_uptime">Uptime</string>
+ <string name="device_info_awaketime">Awake Time</string>
+ <string name="device_info_asleeptime">Asleep Time</string>
+
+ <string name="build_id_label">Build ID</string>
+ <string name="build_date_label">Build Date</string>
+ <string name="build_type_label">Build Type</string>
+ <string name="build_product_label">Build Product</string>
+ <string name="build_user_label">Build Label</string>
+ <string name="build_host_label">Build Host</string>
+ <string name="gsm_version_baseband_label">Baseband Version</string>
+ <string name="gsm_version_ril_impl_label">RIL Impl Version</string>
+
+ <string name="turn_on_radio">Turn on radio</string>
+ <string name="turn_off_radio">Turn off radio</string>
+
+ <string name="refresh_networks">Refresh Network List</string>
+
+ <string name="radioInfo_menu_viewADN">View SIM Address Book</string>
+ <string name="radioInfo_menu_viewFDN">View Fixed Dialing Numbers</string>
+ <string name="radioInfo_menu_viewSDN">View Service Dialing Numbers</string>
+
+ <!-- Package summary in Package Browser -->
+ <string name="disabled"><i>disabled</i></string>
+ <string name="system"><i>system</i></string>
+ <string name="debuggable"><i>debuggable</i></string>
+ <string name="nocode"><i>no code</i></string>
+ <string name="persistent"><i>persistent</i></string>
+ <string name="restart">Restart</string>
+ <string name="package_summary_uid_label">User ID</string>
+ <string name="package_summary_task_label">Task Affinity</string>
+ <string name="package_summary_version_label">Version</string>
+ <string name="package_summary_source_label">Source</string>
+ <string name="package_summary_receivers_label">Receivers</string>
+ <string name="package_summary_data_label">Data</string>
+ <string name="package_summary_instrumentation_label">Instrumentation</string>
+ <string name="package_summary_process_label">Process</string>
+ <string name="package_summary_services_label">Services</string>
+ <string name="package_summary_providers_label">Providers</string>
+ <string name="package_summary_activities_label">Activities</string>
+
+ <!-- Activity details in Package Browser -->
+ <string name="none">"(none)"</string>
+ <string name="yes">Yes</string>
+ <string name="no">No</string>
+ <string name="launch_multiple">Multiple (normal)</string>
+ <string name="launch_singleTop">Single Top</string>
+ <string name="launch_singleTask">Single Task</string>
+ <string name="launch_singleInstance">Single Instance</string>
+ <string name="launch_unknown">"(Unknown)"</string>
+
+ <string name="development_settings_show_cpu_text">Show CPU usage</string>
+ <string name="development_settings_always_finish_text">Immediately destroy activities</string>
+ <string name="development_settings_show_load_text">Show running processes</string>
+ <string name="development_settings_show_updates_text">Show screen updates</string>
+ <string name="development_settings_enable_gl_text">Enable OpenGL ES (reboot needed)</string>
+ <string name="development_settings_allow_mock_location_text">Allow mock locations for testing</string>
+ <string name="development_settings_wait_for_debugger_text">Wait for debugger</string>
+ <string name="development_settings_show_background_text">Show background</string>
+ <string name="development_settings_show_xmpp_text">Show GTalk service connection status</string>
+ <string name="development_settings_debug_app_label_text">Debug App:</string>
+ <string name="development_settings_show_sleep_text">Show sleep state on LED</string>
+ <string name="development_settings_show_maps_compass_text">Show compass in Maps</string>
+ <string name="development_settings_keep_screen_on_text">Keep screen on while plugged in</string>
+
+ <string name="monkey_screen_initialActivity_text"></string>
+ <string name="monkey_screen_number_of_events_label">Number of Events: </string>
+ <string name="monkey_screen_start_text">Start</string>
+ <string name="monkey_screen_initial_activity_label">Initial Activity: </string>
+
+ <string name="radio_issue_submit_text">Submit report</string>
+ <string name="radio_issue_instructions_text">Enter a description of the issue.</string>
+
+ <string name="show_activity_clear_on_background_label">Clear on Background</string>
+ <string name="show_activity_task_affinity_label">Task Affinity</string>
+ <string name="show_activity_process_label">Process</string>
+ <string name="show_activity_state_not_needed_label">State Not Needed</string>
+ <string name="show_activity_required_permission_label">Required Permission</string>
+ <string name="show_activity_multiprocess_label">Multiprocess</string>
+
+ <string name="red_button_behavior_label">End Button Behavior</string>
+
+ <string name="gls_tester_label">GLS Tester</string>
+ <string name="gls_tester_prefer_hosted">Hosted</string>
+ <string name="gls_tester_require_google">Google</string>
+ <string name="gls_tester_get_accounts">List</string>
+ <string name="gls_tester_clear">Clear</string>
+ <string name="gls_tester_go">Go</string>
+ <string name="gls_tester_do_notification">Notify on failure</string>
+ <string name="gls_tester_run_intent">Run intent</string>
+ <string name="gls_tester_wipe_passwords">Wipe passwords</string>
+ <string name="process_name_header">Process Name:</string>
+ <string name="package_list_header">Packages in process:</string>
+ <string name="package_label">Package Name:</string>
+
+ <!-- Application configuration requirements related attributes -->
+ <string name="touchscreen_label">touchscreen:</string>
+ <string name="input_method_label">inputMethod:</string>
+ <string name="hard_keyboard_label">hardKeyboard:</string>
+ <string name="navigation_label">navigation:</string>
+ <string name="five_way_nav_label">five way nav:</string>
+</resources>
diff --git a/apps/Development/res/values/styles.xml b/apps/Development/res/values/styles.xml
new file mode 100644
index 0000000..591eed8
--- /dev/null
+++ b/apps/Development/res/values/styles.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 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.
+-->
+
+<resources>
+ <style name="SummaryCategoryLayout">
+ <item name="android:layout_width">fill_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:orientation">vertical</item>
+ </style>
+ <style name="SummaryCategoryHeader">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:paddingTop">7dip</item>
+ <item name="android:paddingBottom">1dip</item>
+ <item name="android:maxLines">1</item>
+ <item name="android:textAppearance">@style/TextAppearance.SummaryCategoryHeader</item>
+ </style>
+ <style name="info_layout">
+ <item name="android:orientation">vertical</item>
+ <item name="android:paddingLeft">10dip</item>
+ <item name="android:paddingTop">10dip</item>
+ <item name="android:paddingRight">10dip</item>
+ <item name="android:paddingBottom">10dip</item>
+ <item name="android:layout_width">fill_parent</item>
+ <item name="android:layout_height">fill_parent</item>
+ </style>
+ <style name="entry_layout">
+ <item name="android:orientation">horizontal</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ </style>
+ <style name="info_label">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_label</item>
+ <item name="android:paddingRight">4dip</item>
+ </style>
+
+ <style name="info_value">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_value</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.info_label">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="TextAppearance.SummaryCategoryHeader">
+ <item name="android:textStyle">bold</item>
+ </style>
+
+ <style name="TextAppearance.info_value">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textStyle">normal</item>
+ </style>
+
+</resources>
+
diff --git a/apps/Development/src/com/android/development/AppHwConfigList.java b/apps/Development/src/com/android/development/AppHwConfigList.java
new file mode 100755
index 0000000..52aff0d
--- /dev/null
+++ b/apps/Development/src/com/android/development/AppHwConfigList.java
@@ -0,0 +1,156 @@
+/*
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class AppHwConfigList extends ListActivity {
+ private static final String TAG = "AppHwConfigList";
+ PackageManager mPm;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mPm = getPackageManager();
+ mAdapter = new AppListAdapter(this);
+ if (mAdapter.getCount() <= 0) {
+ finish();
+ } else {
+ setListAdapter(mAdapter);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ PackageInfo app = mAdapter.appForPosition(position);
+ // TODO display all preference settings
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setClass(this, AppHwPref.class);
+ intent.putExtra("packageName", app.packageName);
+ startActivity(intent);
+ }
+
+ private final class AppListAdapter extends BaseAdapter {
+ public AppListAdapter(Context context) {
+ mContext = context;
+ mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ List<ApplicationInfo> appList = mPm.getInstalledApplications(0);
+ for (ApplicationInfo app : appList) {
+ PackageInfo pkgInfo = null;
+ try {
+ pkgInfo = mPm.getPackageInfo(app.packageName, 0);
+ } catch (NameNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ if ((pkgInfo != null)) {
+ if(mList == null) {
+ mList = new ArrayList<PackageInfo>();
+ }
+ mList.add(pkgInfo);
+ }
+ }
+ if (mList != null) {
+ Collections.sort(mList, sDisplayNameComparator);
+ }
+ }
+
+ public PackageInfo appForPosition(int position) {
+ if (mList == null) {
+ return null;
+ }
+ return mList.get(position);
+ }
+
+ public int getCount() {
+ return mList != null ? mList.size() : 0;
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view;
+ if (convertView == null) {
+ view = mInflater.inflate(
+ android.R.layout.simple_list_item_1, parent, false);
+ } else {
+ view = convertView;
+ }
+ bindView(view, mList.get(position));
+ return view;
+ }
+
+ private final void bindView(View view, PackageInfo info) {
+ TextView text = (TextView)view.findViewById(android.R.id.text1);
+ text.setText(info != null ? info.applicationInfo.loadLabel(mPm) : "(none)");
+ }
+
+ protected final Context mContext;
+ protected final LayoutInflater mInflater;
+ protected List<PackageInfo> mList;
+
+ }
+
+ private final Comparator sDisplayNameComparator = new Comparator() {
+ public final int compare(Object a, Object b) {
+ CharSequence sa = ((PackageInfo) a).applicationInfo.loadLabel(mPm);
+ CharSequence sb = ((PackageInfo) b).applicationInfo.loadLabel(mPm);
+ return collator.compare(sa, sb);
+ }
+ private final Collator collator = Collator.getInstance();
+ };
+
+ private AppListAdapter mAdapter;
+}
+
diff --git a/apps/Development/src/com/android/development/AppHwPref.java b/apps/Development/src/com/android/development/AppHwPref.java
new file mode 100644
index 0000000..bf0f84f
--- /dev/null
+++ b/apps/Development/src/com/android/development/AppHwPref.java
@@ -0,0 +1,228 @@
+/*
+**
+** Copyright 2006, 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.android.development;
+
+import com.android.development.R;
+import android.app.Activity;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ConfigurationInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+
+/* This activity displays the hardware configuration details
+ * of an application as defined in its manifests
+ */
+public class AppHwPref extends Activity {
+ private static final String TAG = "AppHwPref";
+ PackageManager mPm;
+ private static final int BASE = 0;
+ private static final int TOUCHSCREEN = BASE + 1;
+ private static final int KEYBOARD_TYPE = BASE + 2;
+ private static final int NAVIGATION = BASE + 3;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Intent intent = getIntent();
+ String pkgName = intent.getStringExtra("packageName");
+ if(pkgName == null) {
+ handleError("Null package name", true);
+ return;
+ }
+ mPm = getPackageManager();
+ PackageInfo pInfo;
+ try {
+ pInfo = mPm.getPackageInfo(pkgName, PackageManager.GET_CONFIGURATIONS);
+ } catch (NameNotFoundException e) {
+ pInfo = null;
+ }
+ if(pInfo == null) {
+ handleError("Failed retrieving packageInfo for pkg:"+pkgName, true);
+ return;
+ }
+ ConfigurationInfo appHwPref[] = pInfo.configPreferences;
+
+ setContentView(R.layout.application_hw_pref);
+ if(appHwPref != null) {
+ displayTextView(R.id.attr_package, pInfo.applicationInfo.loadLabel(mPm));
+ displayTextView(R.id.attr_touchscreen, appHwPref, TOUCHSCREEN);
+ displayTextView(R.id.attr_input_method, appHwPref, KEYBOARD_TYPE);
+ displayTextView(R.id.attr_navigation, appHwPref, NAVIGATION);
+ displayFlag(R.id.attr_hard_keyboard, ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD, appHwPref);
+ displayFlag(R.id.attr_five_way_nav, ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV, appHwPref);
+ }
+ }
+
+ void displayFlag(int viewId, int flagMask, ConfigurationInfo[] appHwPref) {
+ if(appHwPref == null) {
+ return;
+ }
+ boolean flag = false;
+ for (int i = 0; i < appHwPref.length; i++) {
+ ConfigurationInfo pref = appHwPref[i];
+ if((pref.reqInputFeatures & flagMask) != 0) {
+ flag = true;
+ break;
+ }
+ }
+ if(flag) {
+ displayTextView(viewId, "true");
+ } else {
+ displayTextView(viewId, "false");
+ }
+ }
+
+ void handleError(String errMsg, boolean finish) {
+ // TODO display dialog
+ Log.i(TAG, errMsg);
+ if(finish) {
+ finish();
+ }
+ }
+
+ void displayTextView(int textViewId, CharSequence displayStr) {
+ TextView tView = (TextView) findViewById(textViewId);
+ if(displayStr != null) {
+ tView.setText(displayStr);
+ }
+ }
+
+ void displayTextView(int viewId, ConfigurationInfo[] config, int type) {
+ if((config == null) || (config.length < 1)) {
+ return;
+ }
+
+ HashSet<String> list = new HashSet<String>();
+ for(int i = 0; i < config.length; i++) {
+ String str = null;
+ switch(type) {
+ case TOUCHSCREEN:
+ str = getTouchScreenStr(config[i]);
+ break;
+ case KEYBOARD_TYPE:
+ str = getKeyboardTypeStr(config[i]);
+ break;
+ case NAVIGATION:
+ str = getNavigationStr(config[i]);
+ break;
+ }
+ if(str != null) {
+ list.add(str);
+ }
+ }
+ String listStr = "";
+ boolean set = false;
+ for(String str : list) {
+ set = true;
+ listStr += str+",";
+ }
+ if(set) {
+ TextView tView = (TextView)findViewById(viewId);
+ CharSequence txt = listStr.subSequence(0, listStr.length()-1);
+ tView.setText(txt);
+ }
+ }
+
+ String getTouchScreenStr(ConfigurationInfo appHwPref) {
+ if(appHwPref == null) {
+ handleError("Invalid HardwareConfigurationObject", true);
+ return null;
+ }
+ switch(appHwPref.reqTouchScreen) {
+ case Configuration.TOUCHSCREEN_FINGER:
+ return "finger";
+ case Configuration.TOUCHSCREEN_NOTOUCH:
+ return "notouch";
+ case Configuration.TOUCHSCREEN_STYLUS:
+ return "stylus";
+ case Configuration.TOUCHSCREEN_UNDEFINED:
+ return null;
+ default:
+ return null;
+ }
+ }
+
+ String getKeyboardTypeStr(ConfigurationInfo appHwPref) {
+ if(appHwPref == null) {
+ handleError("Invalid HardwareConfigurationObject", true);
+ return null;
+ }
+ switch(appHwPref.reqKeyboardType) {
+ case Configuration.KEYBOARD_12KEY:
+ return "12key";
+ case Configuration.KEYBOARD_NOKEYS:
+ return "nokeys";
+ case Configuration.KEYBOARD_QWERTY:
+ return "querty";
+ case Configuration.KEYBOARD_UNDEFINED:
+ return null;
+ default:
+ return null;
+ }
+ }
+
+ String getNavigationStr(ConfigurationInfo appHwPref) {
+ if(appHwPref == null) {
+ handleError("Invalid HardwareConfigurationObject", true);
+ return null;
+ }
+ switch(appHwPref.reqNavigation) {
+ case Configuration.NAVIGATION_DPAD:
+ return "dpad";
+ case Configuration.NAVIGATION_TRACKBALL:
+ return "trackball";
+ case Configuration.NAVIGATION_WHEEL:
+ return "wheel";
+ case Configuration.NAVIGATION_UNDEFINED:
+ return null;
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ }
+}
+
diff --git a/apps/Development/src/com/android/development/AppPicker.java b/apps/Development/src/com/android/development/AppPicker.java
new file mode 100644
index 0000000..693defb
--- /dev/null
+++ b/apps/Development/src/com/android/development/AppPicker.java
@@ -0,0 +1,167 @@
+/* //device/java/android/android/app/ResolveListActivity.java
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.ActivityManagerNative;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.text.Collator;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class AppPicker extends ListActivity
+{
+ @Override
+ protected void onCreate(Bundle icicle)
+ {
+ super.onCreate(icicle);
+
+ mAdapter = new AppListAdapter(this);
+ if (mAdapter.getCount() <= 0) {
+ finish();
+ } else {
+ setListAdapter(mAdapter);
+ }
+ }
+
+ @Override
+ protected void onResume()
+ {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop()
+ {
+ super.onStop();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id)
+ {
+ ApplicationInfo app = mAdapter.appForPosition(position);
+ Intent intent = new Intent();
+ if (app != null) intent.setAction(app.packageName);
+ setResult(RESULT_OK, intent);
+
+ /* This is a temporary fix for 824637 while it is blocked by 805226. When 805226 is resolved, please remove this. */
+ try {
+ boolean waitForDebugger = Settings.System.getInt(
+ getContentResolver(), Settings.System.WAIT_FOR_DEBUGGER, 0) != 0;
+ ActivityManagerNative.getDefault().setDebugApp(
+ app != null ? app.packageName : null, waitForDebugger, true);
+ } catch (RemoteException ex) {
+ }
+
+ finish();
+ }
+
+ private final class AppListAdapter extends BaseAdapter
+ {
+ public AppListAdapter(Context context)
+ {
+ mContext = context;
+ mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ mList = context.getPackageManager().getInstalledApplications(0);
+ if (mList != null) {
+ Collections.sort(mList, sDisplayNameComparator);
+ mList.add(0, null);
+ }
+ }
+
+ public ApplicationInfo appForPosition(int position)
+ {
+ if (mList == null) {
+ return null;
+ }
+
+ return mList.get(position);
+ }
+
+ public int getCount()
+ {
+ return mList != null ? mList.size() : 0;
+ }
+
+ public Object getItem(int position)
+ {
+ return position;
+ }
+
+ public long getItemId(int position)
+ {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent)
+ {
+ View view;
+ if (convertView == null) {
+ view = mInflater.inflate(
+ android.R.layout.simple_list_item_1, parent, false);
+ } else {
+ view = convertView;
+ }
+ bindView(view, mList.get(position));
+ return view;
+ }
+
+ private final void bindView(View view, ApplicationInfo info)
+ {
+ TextView text = (TextView)view.findViewById(android.R.id.text1);
+
+ text.setText(info != null ? info.packageName : "(none)");
+ }
+
+ protected final Context mContext;
+ protected final LayoutInflater mInflater;
+
+ protected List<ApplicationInfo> mList;
+
+ }
+
+ private final static Comparator sDisplayNameComparator = new Comparator() {
+ public final int
+ compare(Object a, Object b)
+ {
+ CharSequence sa = ((ApplicationInfo) a).packageName;
+ CharSequence sb = ((ApplicationInfo) b).packageName;
+
+ return collator.compare(sa, sb);
+ }
+
+ private final Collator collator = Collator.getInstance();
+ };
+
+ private AppListAdapter mAdapter;
+}
+
diff --git a/apps/Development/src/com/android/development/ArrayAdapter.java b/apps/Development/src/com/android/development/ArrayAdapter.java
new file mode 100644
index 0000000..378e98f
--- /dev/null
+++ b/apps/Development/src/com/android/development/ArrayAdapter.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.widget.BaseAdapter;
+
+import java.util.List;
+
+public abstract class ArrayAdapter<E> extends BaseAdapter
+{
+ public ArrayAdapter(Context context, int layoutRes) {
+ mContext = context;
+ mInflater = (LayoutInflater)context.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ mLayoutRes = layoutRes;
+ }
+
+ public void setSource(List<E> list) {
+ mList = list;
+ }
+
+ public abstract void bindView(View view, E item);
+
+ public E itemForPosition(int position) {
+ if (mList == null) {
+ return null;
+ }
+
+ return mList.get(position);
+ }
+
+ public int getCount() {
+ return mList != null ? mList.size() : 0;
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view;
+ if (convertView == null) {
+ view = mInflater.inflate(mLayoutRes, parent, false);
+ } else {
+ view = convertView;
+ }
+ bindView(view, mList.get(position));
+ return view;
+ }
+
+ private final Context mContext;
+ private final LayoutInflater mInflater;
+ private final int mLayoutRes;
+ private List<E> mList;
+}
+
diff --git a/apps/Development/src/com/android/development/ColumnData.java b/apps/Development/src/com/android/development/ColumnData.java
new file mode 100644
index 0000000..28781c2
--- /dev/null
+++ b/apps/Development/src/com/android/development/ColumnData.java
@@ -0,0 +1,31 @@
+/* //device/apps/Notes/NotesList.java
+**
+** Copyright 2006, 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.android.development;
+
+import java.util.ArrayList;
+
+class ColumnData
+{
+ ColumnData(String k, String v)
+ {
+ key = k;
+ value = v;
+ }
+ public String key;
+ public String value;
+}
+
diff --git a/apps/Development/src/com/android/development/DataList.java b/apps/Development/src/com/android/development/DataList.java
new file mode 100644
index 0000000..5dee2fe
--- /dev/null
+++ b/apps/Development/src/com/android/development/DataList.java
@@ -0,0 +1,134 @@
+/* //device/apps/Notes/NotesList.java
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.SimpleCursorAdapter;
+
+import java.util.ArrayList;
+
+public class DataList extends ListActivity
+{
+ public void onCreate(Bundle icicle)
+ {
+ super.onCreate(icicle);
+
+ Intent intent = getIntent();
+
+ mCursor = getContentResolver().query(intent.getData(), null, null, null, null);
+ mDisplay = intent.getStringExtra("display");
+ if (mDisplay == null) {
+ mDisplay = "_id";
+ }
+
+ if (mCursor != null) {
+ setListAdapter(new SimpleCursorAdapter(
+ this,
+ R.layout.url_list,
+ mCursor,
+ new String[] {mDisplay},
+ new int[] {android.R.id.text1}));
+ }
+ }
+
+ public void onStop()
+ {
+ super.onStop();
+
+ if (mCursor != null) {
+ mCursor.deactivate();
+ }
+ }
+
+ public void onResume()
+ {
+ super.onResume();
+
+ if (mCursor != null) {
+ mCursor.requery();
+ }
+
+ setTitle("Showing " + mDisplay);
+ }
+
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ super.onCreateOptionsMenu(menu);
+ menu.add(0, 0, 0, "Requery").setOnMenuItemClickListener(mRequery);
+ return true;
+ }
+
+ protected void onListItemClick(ListView l, View v, int position, long id)
+ {
+ mCursor.moveToPosition(position);
+
+ ArrayList<ColumnData> data = new ArrayList<ColumnData>();
+
+ String[] columnNames = mCursor.getColumnNames();
+ for (int i=0; i<columnNames.length; i++) {
+ String str = mCursor.getString(i);
+ ColumnData cd = new ColumnData(columnNames[i], str);
+ data.add(cd);
+ }
+
+
+ Uri uri = null;
+ int idCol = mCursor.getColumnIndex("_id");
+ if (idCol >= 0) {
+ uri = Uri.withAppendedPath(getIntent().getData(), mCursor.getString(idCol));
+ }
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ intent.setClass(this, Details.class);
+
+ intent.putExtra("data", data);
+ int displayColumn = mCursor.getColumnIndex(mDisplay);
+ if (displayColumn >= 0) {
+ intent.putExtra("title",
+ ((ColumnData)data.get(displayColumn)).value);
+ }
+
+ startActivity(intent);
+ }
+
+ MenuItem.OnMenuItemClickListener mRequery = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ // Should just do requery on cursor, but
+ // doesn't work right now. So do this instead.
+ mCursor.requery();
+ if (mCursor != null) {
+ setListAdapter(new SimpleCursorAdapter(
+ DataList.this,
+ R.layout.url_list,
+ mCursor,
+ new String[] {mDisplay},
+ new int[] {android.R.id.text1}));
+ }
+ return true;
+ }
+ };
+
+ private String mDisplay;
+ private Cursor mCursor;
+}
diff --git a/apps/Development/src/com/android/development/Details.java b/apps/Development/src/com/android/development/Details.java
new file mode 100644
index 0000000..16722a3
--- /dev/null
+++ b/apps/Development/src/com/android/development/Details.java
@@ -0,0 +1,157 @@
+/* //device/apps/Notes/NotesList.java
+**
+** Copyright 2006, 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.android.development;
+
+import java.util.ArrayList;
+
+import android.content.Intent;
+import android.app.Activity;
+import android.database.Cursor;
+import android.graphics.Typeface;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class Details extends Activity
+{
+ public void onCreate(Bundle icicle)
+ {
+ super.onCreate(icicle);
+
+ Intent intent = getIntent();
+
+ String title = intent.getStringExtra("title");
+ if (title == null) {
+ title = "Details";
+ }
+ setTitle(title);
+
+ mScrollView = new ScrollView(this);
+ setContentView(mScrollView);
+ mScrollView.setFocusable(true);
+
+ mData = (ArrayList<ColumnData>)getIntent().getExtra("data");
+ addDataViews();
+ }
+
+ public void onResume()
+ {
+ super.onResume();
+ }
+
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ super.onCreateOptionsMenu(menu);
+ menu.add(0, 0, 0, "Requery").setOnMenuItemClickListener(mRequery);
+ menu.add(0, 0, 0, "Print to stdout").setOnMenuItemClickListener(mPrintToStdout);
+ return true;
+ }
+
+ void addDataViews()
+ {
+ int oldScroll = 0;
+
+ if (mLinearLayout != null) {
+ mScrollView.removeView(mLinearLayout);
+ }
+ mLinearLayout = new LinearLayout(this);
+ mScrollView.addView(mLinearLayout, new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT));
+ mLinearLayout.setOrientation(LinearLayout.VERTICAL);
+
+ // Here in onStart, we're given data. We use that because some
+ // data that we show is transient and can't be retrieved from a url.
+ // We'll try to use that in requery
+ int count = mData.size();
+ for (int i=0; i<count; i++) {
+ ColumnData cd = mData.get(i);
+ TextView label = makeView(cd.key, true, 12);
+ TextView contents = makeView(cd.value, false, 12);
+ contents.setPadding(3, 0, 0, i==count-1?0:3);
+ mLinearLayout.addView(label, lazy());
+ mLinearLayout.addView(contents, lazy());
+ }
+ }
+
+ TextView makeView(String str, boolean bold, int fontSize)
+ {
+ if (str == null) {
+ str = "(null)";
+ }
+ TextView v = new TextView(this);
+ v.setText(str);
+ v.setTextSize(fontSize);
+ if (bold) {
+ v.setTypeface(Typeface.DEFAULT_BOLD);
+ }
+ return v;
+ }
+
+ LinearLayout.LayoutParams lazy()
+ {
+ return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT, 0);
+ }
+
+ MenuItem.OnMenuItemClickListener mRequery = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = getIntent();
+ Cursor c = getContentResolver().query(intent.getData(), null, null, null, null);
+ if (c != null && c.moveToNext()) {
+ mData.clear();
+ String[] columnNames = c.getColumnNames();
+ for (int i=0; i<columnNames.length; i++) {
+ String str = c.getString(i);
+ ColumnData cd = new ColumnData(columnNames[i], str);
+ mData.add(cd);
+ }
+ addDataViews();
+ } else {
+ TextView error = new TextView(Details.this);
+ error.setText("Showing old data.\nURL couldn't be requeried:\n"
+ + intent.getData());
+ error.setTextColor(0xffff0000);
+ error.setTextSize(11);
+ mLinearLayout.addView(error, 0, lazy());
+ }
+ return true;
+ }
+ };
+
+ MenuItem.OnMenuItemClickListener mPrintToStdout = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ System.out.println("=== begin data ===");
+ int count = mData.size();
+ for (int i=0; i<count; i++) {
+ ColumnData cd = mData.get(i);
+ System.out.println(" " + cd.key + ": " + cd.value);
+ }
+ System.out.println("=== end data ===");
+ return true;
+ }
+ };
+
+ LinearLayout mLinearLayout;
+ ScrollView mScrollView;
+ ArrayList<ColumnData> mData;
+}
diff --git a/apps/Development/src/com/android/development/Development.java b/apps/Development/src/com/android/development/Development.java
new file mode 100644
index 0000000..a3979f2
--- /dev/null
+++ b/apps/Development/src/com/android/development/Development.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.LauncherActivity;
+import android.content.Intent;
+
+public class Development extends LauncherActivity
+{
+ @Override
+ protected Intent getTargetIntent() {
+ Intent targetIntent = new Intent(Intent.ACTION_MAIN, null);
+ targetIntent.addCategory(Intent.CATEGORY_TEST);
+ targetIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return targetIntent;
+ }
+}
diff --git a/apps/Development/src/com/android/development/DevelopmentSettings.java b/apps/Development/src/com/android/development/DevelopmentSettings.java
new file mode 100644
index 0000000..cdc1e0a
--- /dev/null
+++ b/apps/Development/src/com/android/development/DevelopmentSettings.java
@@ -0,0 +1,510 @@
+/* //device/apps/Settings/src/com/android/settings/Keyguard.java
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.RemoteException;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.ServiceManager;
+import android.os.ServiceManagerNative;
+import android.provider.Settings;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.IWindowManager;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.Spinner;
+import android.widget.AdapterView.OnItemSelectedListener;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Map;
+
+public class DevelopmentSettings extends Activity {
+ private static final String TAG = "DevelopmentSettings";
+ private static final int DEBUG_APP_REQUEST = 1;
+
+ private Button mDebugAppButton;
+ private CheckBox mWaitForDebuggerCB;
+ private CheckBox mAlwaysFinishCB;
+ private CheckBox mShowLoadCB;
+ private CheckBox mShowCpuCB;
+ private CheckBox mEnableGLCB;
+ private CheckBox mShowUpdatesCB;
+ private CheckBox mShowBackgroundCB;
+ private CheckBox mShowSleepCB;
+ private CheckBox mShowMapsCompassCB;
+ private CheckBox mShowXmppCB;
+ private Spinner mMaxProcsSpinner;
+ private Spinner mWindowAnimationScaleSpinner;
+ private Spinner mTransitionAnimationScaleSpinner;
+ private Spinner mFontHintingSpinner;
+
+ private String mDebugApp;
+ private boolean mWaitForDebugger;
+ private boolean mAlwaysFinish;
+ private int mProcessLimit;
+ private boolean mShowSleep;
+ private boolean mShowMapsCompass;
+ private boolean mShowXmpp;
+ private AnimationScaleSelectedListener mWindowAnimationScale
+ = new AnimationScaleSelectedListener(0);
+ private AnimationScaleSelectedListener mTransitionAnimationScale
+ = new AnimationScaleSelectedListener(1);
+ private SharedPreferences mSharedPrefs;
+ private IWindowManager mWindowManager;
+
+ private static final boolean FONT_HINTING_ENABLED = true;
+ private static final String FONT_HINTING_FILE = "/data/misc/font-hack";
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.development_settings);
+
+ mDebugAppButton = (Button)findViewById(R.id.debug_app);
+ mDebugAppButton.setOnClickListener(mDebugAppClicked);
+ mWaitForDebuggerCB = (CheckBox)findViewById(R.id.wait_for_debugger);
+ mWaitForDebuggerCB.setOnClickListener(mWaitForDebuggerClicked);
+ mAlwaysFinishCB = (CheckBox)findViewById(R.id.always_finish);
+ mAlwaysFinishCB.setOnClickListener(mAlwaysFinishClicked);
+ mShowLoadCB = (CheckBox)findViewById(R.id.show_load);
+ mShowLoadCB.setOnClickListener(mShowLoadClicked);
+ mShowCpuCB = (CheckBox)findViewById(R.id.show_cpu);
+ mShowCpuCB.setOnCheckedChangeListener(new SurfaceFlingerClicker(1000));
+ mEnableGLCB = (CheckBox)findViewById(R.id.enable_gl);
+ mEnableGLCB.getLayoutParams().height = 0; // doesn't do anything
+ mEnableGLCB.setOnCheckedChangeListener(new SurfaceFlingerClicker(1004));
+ mShowUpdatesCB = (CheckBox)findViewById(R.id.show_updates);
+ mShowUpdatesCB.setOnCheckedChangeListener(new SurfaceFlingerClicker(1002));
+ mShowBackgroundCB = (CheckBox)findViewById(R.id.show_background);
+ mShowBackgroundCB.setOnCheckedChangeListener(new SurfaceFlingerClicker(1003));
+ mShowSleepCB = (CheckBox)findViewById(R.id.show_sleep);
+ mShowSleepCB.setOnClickListener(mShowSleepClicked);
+ mShowMapsCompassCB = (CheckBox)findViewById(R.id.show_maps_compass);
+ mShowMapsCompassCB.setOnClickListener(mShowMapsCompassClicked);
+ mShowXmppCB = (CheckBox)findViewById(R.id.show_xmpp);
+ mShowXmppCB.setOnClickListener(mShowXmppClicked);
+ mMaxProcsSpinner = (Spinner)findViewById(R.id.max_procs);
+ mMaxProcsSpinner.setOnItemSelectedListener(mMaxProcsChanged);
+ ArrayAdapter<String> adapter = new ArrayAdapter<String>(
+ this,
+ android.R.layout.simple_spinner_item,
+ new String[] {
+ "No App Process Limit",
+ "Max 1 App Process",
+ "Max 2 App Processes",
+ "Max 3 App Processes",
+ "Max 4 App Processes" });
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ mMaxProcsSpinner.setAdapter(adapter);
+ mWindowAnimationScaleSpinner = setupAnimationSpinner(
+ R.id.window_animation_scale, mWindowAnimationScale, "Window");
+ mTransitionAnimationScaleSpinner = setupAnimationSpinner(
+ R.id.transition_animation_scale, mTransitionAnimationScale, "Transition");
+
+ if (FONT_HINTING_ENABLED) {
+ mFontHintingSpinner = (Spinner)findViewById(R.id.font_hinting);
+ mFontHintingSpinner.setOnItemSelectedListener(mFontHintingChanged);
+ adapter = new ArrayAdapter<String>(
+ this,
+ android.R.layout.simple_spinner_item,
+ new String[] {
+ "Light Hinting",
+ "Medium Hinting" });
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ mFontHintingSpinner.setAdapter(adapter);
+ }
+ mSharedPrefs = getSharedPreferences("global", 0);
+ mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
+ }
+
+ Spinner setupAnimationSpinner(int resid,
+ AnimationScaleSelectedListener listener, String name) {
+ Spinner spinner = (Spinner)findViewById(resid);
+ spinner.setOnItemSelectedListener(listener);
+ ArrayAdapter adapter = new ArrayAdapter<String>(
+ this,
+ android.R.layout.simple_spinner_item,
+ new String[] {
+ name + " Animation Scale 1x",
+ name + " Animation Scale 2x",
+ name + " Animation Scale 5x",
+ name + " Animation Scale 10x",
+ name + " Animation Off" });
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ spinner.setAdapter(adapter);
+ listener.spinner = spinner;
+ return spinner;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateDebugOptions();
+ updateFinishOptions();
+ updateProcessLimitOptions();
+ updateSharedOptions();
+ updateFlingerOptions();
+ updateSleepOptions();
+ updateMapsCompassOptions();
+ updateXmppOptions();
+
+ try {
+ FileInputStream in = new FileInputStream( FONT_HINTING_FILE );
+ int mode = in.read() - 48;
+ if (mode >= 0 && mode < 3)
+ mFontHintingSpinner.setSelection(mode);
+ in.close();
+ } catch (Exception e) {
+ }
+
+ mWindowAnimationScale.load();
+ mTransitionAnimationScale.load();
+ }
+
+ private void writeDebugOptions() {
+ try {
+ ActivityManagerNative.getDefault().setDebugApp(
+ mDebugApp, mWaitForDebugger, true);
+ } catch (RemoteException ex) {
+ }
+ }
+
+ private void updateDebugOptions() {
+ mDebugApp = Settings.System.getString(
+ getContentResolver(), Settings.System.DEBUG_APP);
+ mWaitForDebugger = Settings.System.getInt(
+ getContentResolver(), Settings.System.WAIT_FOR_DEBUGGER, 0) != 0;
+
+ mDebugAppButton.setText(
+ mDebugApp == null || mDebugApp.length() == 0 ? "(none)" : mDebugApp);
+ mWaitForDebuggerCB.setChecked(mWaitForDebugger);
+ }
+
+ private void writeFinishOptions() {
+ try {
+ ActivityManagerNative.getDefault().setAlwaysFinish(mAlwaysFinish);
+ } catch (RemoteException ex) {
+ }
+ }
+
+ private void updateFinishOptions() {
+ mAlwaysFinish = Settings.System.getInt(
+ getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0) != 0;
+ mAlwaysFinishCB.setChecked(mAlwaysFinish);
+ }
+
+ private void writeProcessLimitOptions() {
+ try {
+ ActivityManagerNative.getDefault().setProcessLimit(mProcessLimit);
+ } catch (RemoteException ex) {
+ }
+ }
+
+ private void updateProcessLimitOptions() {
+ try {
+ mProcessLimit = ActivityManagerNative.getDefault().getProcessLimit();
+ mMaxProcsSpinner.setSelection(mProcessLimit);
+ } catch (RemoteException ex) {
+ }
+ }
+
+ private void updateSharedOptions() {
+ mShowLoadCB.setChecked(Settings.System.getInt(getContentResolver(),
+ Settings.System.SHOW_PROCESSES, 0) != 0);
+ }
+
+ private void updateFlingerOptions() {
+ // magic communication with surface flinger.
+ try {
+ IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+ if (flinger != null) {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ flinger.transact(1010, data, reply, 0);
+ int v;
+ v = reply.readInt();
+ mShowCpuCB.setChecked(v != 0);
+ v = reply.readInt();
+ mEnableGLCB.setChecked(v != 0);
+ v = reply.readInt();
+ mShowUpdatesCB.setChecked(v != 0);
+ v = reply.readInt();
+ mShowBackgroundCB.setChecked(v != 0);
+ reply.recycle();
+ data.recycle();
+ }
+ } catch (RemoteException ex) {
+ }
+ }
+
+ private void writeSleepOptions() {
+ try {
+ FileOutputStream os = new FileOutputStream(
+ "/sys/devices/platform/gpio_sleep_debug/enable", true);
+ if(mShowSleep)
+ os.write(new byte[] { (byte)'1' });
+ else
+ os.write(new byte[] { (byte)'0' });
+ os.close();
+ } catch (Exception e) {
+ Log.w(TAG, "Failed setting gpio_sleep_debug");
+ }
+ }
+
+ private void updateSleepOptions() {
+ try {
+ FileInputStream is = new FileInputStream(
+ "/sys/devices/platform/gpio_sleep_debug/enable");
+ int character = is.read();
+ mShowSleep = character == '1';
+ is.close();
+ } catch (Exception e) {
+ Log.w(TAG, "Failed reading gpio_sleep_debug");
+ mShowSleep = false;
+ }
+ mShowSleepCB.setChecked(mShowSleep);
+ }
+
+ private void writeMapsCompassOptions() {
+ try {
+ Context c = createPackageContext("com.google.android.apps.maps", 0);
+ c.getSharedPreferences("extra-features", MODE_WORLD_WRITEABLE)
+ .edit()
+ .putBoolean("compass", mShowMapsCompass)
+ .commit();
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Failed setting maps compass");
+ e.printStackTrace();
+ }
+ }
+
+ private void updateMapsCompassOptions() {
+ try {
+ Context c = createPackageContext("com.google.android.apps.maps", 0);
+ mShowMapsCompass = c.getSharedPreferences("extra-features", MODE_WORLD_READABLE)
+ .getBoolean("compass", false);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Failed reading maps compass");
+ e.printStackTrace();
+ }
+ mShowMapsCompassCB.setChecked(mShowMapsCompass);
+ }
+
+ private void writeXmppOptions() {
+ Settings.System.setShowGTalkServiceStatus(getContentResolver(), mShowXmpp);
+ }
+
+ private void updateXmppOptions() {
+ mShowXmpp = Settings.System.getShowGTalkServiceStatus(getContentResolver());
+ mShowXmppCB.setChecked(mShowXmpp);
+ }
+
+ private View.OnClickListener mDebugAppClicked = new View.OnClickListener() {
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClass(DevelopmentSettings.this, AppPicker.class);
+ startActivityForResult(intent, DEBUG_APP_REQUEST);
+ }
+ };
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (requestCode == DEBUG_APP_REQUEST && resultCode == RESULT_OK) {
+ mDebugApp = intent.getAction();
+ writeDebugOptions();
+ updateDebugOptions();
+ }
+ }
+
+ private View.OnClickListener mWaitForDebuggerClicked =
+ new View.OnClickListener() {
+ public void onClick(View v) {
+ mWaitForDebugger = ((CheckBox)v).isChecked();
+ writeDebugOptions();
+ updateDebugOptions();
+ }
+ };
+
+ private View.OnClickListener mAlwaysFinishClicked =
+ new View.OnClickListener() {
+ public void onClick(View v) {
+ mAlwaysFinish = ((CheckBox)v).isChecked();
+ writeFinishOptions();
+ updateFinishOptions();
+ }
+ };
+
+ private View.OnClickListener mShowLoadClicked = new View.OnClickListener() {
+ public void onClick(View v) {
+ boolean value = ((CheckBox)v).isChecked();
+ Settings.System.putInt(getContentResolver(),
+ Settings.System.SHOW_PROCESSES, value ? 1 : 0);
+ Intent service = (new Intent())
+ .setClassName("android", "com.android.server.LoadAverageService");
+ if (value) {
+ startService(service);
+ } else {
+ stopService(service);
+ }
+ }
+ };
+
+ private class SurfaceFlingerClicker implements CheckBox.OnCheckedChangeListener {
+ SurfaceFlingerClicker(int code) {
+ mCode = code;
+ }
+
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ try {
+ IBinder flinger = ServiceManager.getService("SurfaceFlinger");
+ if (flinger != null) {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken("android.ui.ISurfaceComposer");
+ data.writeInt(isChecked ? 1 : 0);
+ flinger.transact(mCode, data, null, 0);
+ data.recycle();
+
+ updateFlingerOptions();
+ }
+ } catch (RemoteException ex) {
+ }
+ }
+
+ final int mCode;
+ }
+
+ private View.OnClickListener mShowSleepClicked =
+ new View.OnClickListener() {
+ public void onClick(View v) {
+ mShowSleep = ((CheckBox)v).isChecked();
+ writeSleepOptions();
+ updateSleepOptions();
+ }
+ };
+
+ private View.OnClickListener mShowMapsCompassClicked =
+ new View.OnClickListener() {
+ public void onClick(View v) {
+ mShowMapsCompass = ((CheckBox)v).isChecked();
+ writeMapsCompassOptions();
+ updateMapsCompassOptions();
+ }
+ };
+
+
+ private View.OnClickListener mShowXmppClicked = new View.OnClickListener() {
+ public void onClick(View v) {
+ mShowXmpp = ((CheckBox)v).isChecked();
+ // can streamline these calls, but keeping consistent with the
+ // other development settings code.
+ writeXmppOptions();
+ updateXmppOptions();
+ }
+ };
+
+ private Spinner.OnItemSelectedListener mMaxProcsChanged
+ = new Spinner.OnItemSelectedListener() {
+ public void onItemSelected(android.widget.AdapterView av, View v,
+ int position, long id) {
+ mProcessLimit = position;
+ writeProcessLimitOptions();
+ }
+
+ public void onNothingSelected(android.widget.AdapterView av) {
+ }
+ };
+
+ private Spinner.OnItemSelectedListener mFontHintingChanged
+ = new Spinner.OnItemSelectedListener() {
+ public void onItemSelected(android.widget.AdapterView av, View v,
+ int position, long id) {
+ try {
+ FileOutputStream out = new FileOutputStream( FONT_HINTING_FILE );
+ out.write(position+48);
+ out.close();
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to write font hinting settings to /data/misc/font-hack");
+ }
+ }
+
+ public void onNothingSelected(android.widget.AdapterView av) {
+ }
+ };
+
+ class AnimationScaleSelectedListener implements OnItemSelectedListener {
+ final int which;
+ float scale;
+ Spinner spinner;
+
+ AnimationScaleSelectedListener(int _which) {
+ which = _which;
+ }
+
+ void load() {
+ try {
+ scale = mWindowManager.getAnimationScale(which);
+
+ if (scale > 0.1f && scale < 2.0f) {
+ spinner.setSelection(0);
+ } else if (scale >= 2.0f && scale < 3.0f) {
+ spinner.setSelection(1);
+ } else if (scale >= 4.9f && scale < 6.0f) {
+ spinner.setSelection(2);
+ } else if (scale >= 9.9f && scale < 11.0f) {
+ spinner.setSelection(3);
+ } else {
+ spinner.setSelection(4);
+ }
+ } catch (RemoteException e) {
+ }
+ }
+
+ public void onItemSelected(android.widget.AdapterView av, View v,
+ int position, long id) {
+ switch (position) {
+ case 0: scale = 1.0f; break;
+ case 1: scale = 2.0f; break;
+ case 2: scale = 5.0f; break;
+ case 3: scale = 10.0f; break;
+ case 4: scale = 0.0f; break;
+ default: break;
+ }
+
+ try {
+ mWindowManager.setAnimationScale(which, scale);
+ } catch (RemoteException e) {
+ }
+ }
+
+ public void onNothingSelected(android.widget.AdapterView av) {
+ }
+ }
+}
diff --git a/apps/Development/src/com/android/development/EnterURL.java b/apps/Development/src/com/android/development/EnterURL.java
new file mode 100644
index 0000000..76b8a34
--- /dev/null
+++ b/apps/Development/src/com/android/development/EnterURL.java
@@ -0,0 +1,310 @@
+/* //device/apps/Notes/NotesList.java
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.ListActivity;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.Selection;
+import android.text.format.DateUtils;
+import android.util.AttributeSet;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.graphics.Rect;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+
+public class EnterURL extends ListActivity
+{
+ private static final int DATABASE_VERSION = 1;
+ public static class UrlEditText extends EditText
+ {
+ public UrlEditText(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect)
+ {
+ super.onFocusChanged(focused, direction, previouslyFocusedRect);
+ if (focused) {
+ Editable text = getText();
+ String str = text.toString();
+ int highlightStart = 0;
+ if (str.startsWith("content://")) {
+ highlightStart = "content://".length();
+ }
+ Selection.setSelection(text, highlightStart, text.length());
+ }
+ }
+ }
+
+ public static class DisplayEditText extends EditText
+ {
+ public DisplayEditText(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect)
+ {
+ super.onFocusChanged(focused, direction, previouslyFocusedRect);
+ if (focused) {
+ Editable text = getText();
+ Selection.setSelection(text, 0, text.length());
+ }
+ }
+ }
+
+ @Override
+ public View onCreateView(String name, Context context, AttributeSet attrs)
+ {
+ if (name.equals("com.android.development.UrlEditText")) {
+ return new UrlEditText(this, attrs);
+ }
+ if (name.equals("com.android.development.DisplayEditText")) {
+ return new DisplayEditText(this, attrs);
+ }
+ return null;
+ }
+
+ View.OnClickListener mViewItemAction = new View.OnClickListener () {
+ public void onClick(View v)
+ {
+ String url = mUrlField.getText().toString();
+ String display = mDisplayField.getText().toString();
+ viewItem(url, display);
+ }
+ };
+
+ public void onCreate(Bundle icicle)
+ {
+ super.onCreate(icicle);
+ setContentView(R.layout.enter_url);
+
+ // display
+ mDisplayField = (DisplayEditText)findViewById(R.id.display_edit_text);
+ mDisplayField.setOnClickListener(mViewItemAction);
+ // url
+ mUrlField = (UrlEditText)findViewById(R.id.url_edit_text);
+ mUrlField.setOnClickListener(mViewItemAction);
+ }
+
+ public void onStop()
+ {
+ super.onStop();
+
+ if (mCursor != null) {
+ mCursor.deactivate();
+ }
+ }
+
+ public void onResume()
+ {
+ super.onResume();
+
+ // show the history
+ loadPrefs();
+ fillListView();
+ if (mHistory.size() > 0) {
+ ListView lv = this.getListView();
+ lv.setSelection(0);
+ lv.requestFocus();
+ }
+ }
+
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ super.onCreateOptionsMenu(menu);
+ menu.add(0, 0, 0, "Clear Bookmarks").setOnMenuItemClickListener(mClearBookmarks);
+ return true;
+ }
+
+ protected void onListItemClick(ListView l, View v, int position, long id)
+ {
+ HistoryEntry he = mHistory.get(position);
+ viewItem(he.url, he.display);
+ }
+
+ private final void viewItem(String url, String display)
+ {
+ // -------------- save this in the history ----------------
+ // look in the history
+ int count = mHistory.size();
+ int i;
+ for (i=0; i<count; i++) {
+ HistoryEntry he = mHistory.get(i);
+ if (he.url.equals(url) && he.display.equals(display)) {
+ he.updateAccessTime();
+ mHistory.remove(i);
+ mHistory.add(0, he);
+ break;
+ }
+ }
+ if (i >= count) {
+ // didn't find it, add it first
+ HistoryEntry he = new HistoryEntry();
+ he.url = url;
+ he.display = display;
+ he.updateAccessTime();
+ mHistory.add(0, he);
+ }
+
+ savePrefs();
+
+ // -------------- view it ---------------------------------
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ intent.setClass(this, DataList.class);
+ intent.putExtra("display", display);
+ startActivity(intent);
+ }
+
+ MenuItem.OnMenuItemClickListener mClearBookmarks = new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ mHistory.clear();
+ savePrefs();
+ fillListView();
+ return true;
+ }
+ };
+
+ private void fillListView()
+ {
+ loadPrefs();
+ ArrayList<HashMap<String, String>> d = new ArrayList<HashMap<String, String>>();
+ int count = mHistory.size();
+ for (int i=0; i<count; i++) {
+ HashMap<String, String> m = new HashMap<String, String>();
+ HistoryEntry he = mHistory.get(i);
+ m.put("title", he.url + " (" + he.display + ")");
+ d.add(m);
+ }
+ setListAdapter(new SimpleAdapter(this, d, R.layout.url_list,
+ new String[] {"title"},
+ new int[] {android.R.id.text1}));
+ }
+
+ SQLiteDatabase openDB()
+ {
+ SQLiteDatabase db = null;
+ db = openOrCreateDatabase("inspector.db", 0, null);
+ int version = db.getVersion();
+ if (version != DATABASE_VERSION) {
+ db.execSQL("CREATE TABLE History ("
+ + " url TEXT,"
+ + " display TEXT,"
+ + " lastAccessTime TEXT"
+ + ");");
+ db.execSQL("CREATE TABLE FieldState ("
+ + " url TEXT,"
+ + " display TEXT"
+ + ");");
+ db.setVersion(DATABASE_VERSION);
+ }
+ return db;
+ }
+
+ private void loadPrefs()
+ {
+ SQLiteDatabase db = openDB();
+ Cursor c = db.query("History",
+ new String[] { "url", "display", "lastAccessTime" },
+ null, null, null, null, "lastAccessTime DESC");
+ int urlCol = c.getColumnIndex("url");
+ int accessCol = c.getColumnIndex("lastAccessTime");
+ int displayCol = c.getColumnIndex("display");
+ mHistory.clear();
+ while (c.moveToNext()) {
+ HistoryEntry he = new HistoryEntry();
+ he.url = c.getString(urlCol);
+ he.display = c.getString(displayCol);
+ he.lastAccessTime = c.getString(accessCol);
+ mHistory.add(he);
+ }
+
+ c = db.query("FieldState", null, null, null, null, null, null);
+ if (c.moveToNext()) {
+ urlCol = c.getColumnIndex("url");
+ displayCol = c.getColumnIndex("display");
+ mUrlField.setText(c.getString(urlCol));
+ mDisplayField.setText(c.getString(displayCol));
+ } else {
+ mDisplayField.setText("_id");
+ mUrlField.setText("content://");
+ }
+
+ db.close();
+ }
+
+ private void savePrefs()
+ {
+ ContentValues m;
+ HistoryEntry he;
+
+ SQLiteDatabase db = openDB();
+ db.execSQL("DELETE FROM History;");
+ int count = mHistory.size();
+ for (int i=0; i<count; i++) {
+ m = new ContentValues();
+ he = mHistory.get(i);
+ m.put("url", he.url);
+ m.put("display", he.display);
+ m.put("lastAccessTime", he.lastAccessTime);
+ db.insert("History", null, m);
+ }
+
+ db.execSQL("DELETE FROM FieldState");
+ m = new ContentValues();
+ m.put("url", mUrlField.getText().toString());
+ m.put("display", mDisplayField.getText().toString());
+ db.insert("FieldState", null, m);
+
+ db.close();
+ }
+
+ private class HistoryEntry
+ {
+ public String url;
+ public String display;
+ public String lastAccessTime;
+ public void updateAccessTime()
+ {
+ this.lastAccessTime = DateUtils.writeDateTime(
+ new GregorianCalendar());
+ }
+ }
+
+ private ArrayList<HistoryEntry> mHistory = new ArrayList<HistoryEntry>();
+ private UrlEditText mUrlField;
+ private DisplayEditText mDisplayField;
+ private Cursor mCursor;
+}
diff --git a/apps/Development/src/com/android/development/ExceptionBrowser.java b/apps/Development/src/com/android/development/ExceptionBrowser.java
new file mode 100644
index 0000000..63270aa
--- /dev/null
+++ b/apps/Development/src/com/android/development/ExceptionBrowser.java
@@ -0,0 +1,171 @@
+/*
+** Copyright 2007, 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.android.development;
+
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.database.ContentObserver;
+import android.database.DataSetObserver;
+import android.graphics.Typeface;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Checkin;
+import android.server.data.CrashData;
+import android.server.data.ThrowableData;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.KeyEvent;
+import android.widget.*;
+
+import org.apache.commons.codec.binary.Base64;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ *
+ *
+ */
+public class ExceptionBrowser extends ListActivity {
+ /** Logging identifier. */
+ private static final String TAG = "ExceptionBrowser";
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ Cursor cursor = getContentResolver().query(
+ Checkin.Crashes.CONTENT_URI,
+ new String[] { Checkin.Crashes._ID, Checkin.Crashes.DATA },
+ null, null, null);
+
+ if (cursor != null) {
+ startManagingCursor(cursor);
+
+ setListAdapter(new CursorAdapter(this, cursor, true) {
+ public View newView(Context context, Cursor c, ViewGroup v) {
+ return new CrashListItem(context);
+ }
+
+ public void bindView(View view, Context c, Cursor cursor) {
+ CrashListItem item = (CrashListItem) view;
+ try {
+ String data = cursor.getString(1);
+ CrashData crash = new CrashData(
+ new DataInputStream(
+ new ByteArrayInputStream(
+ Base64.decodeBase64(data.getBytes()))));
+
+ ThrowableData exc = crash.getThrowableData();
+ item.setText(exc.getType() + ": " + exc.getMessage());
+ item.setCrashData(crash);
+ } catch (IOException e) {
+ item.setText("Invalid crash: " + e);
+ Log.e(TAG, "Invalid crash", e);
+ }
+ }
+ });
+ } else {
+ // No database, no exceptions, empty list.
+ setListAdapter(new BaseAdapter() {
+ public int getCount() {
+ return 0;
+ }
+
+ public Object getItem(int position) {
+ throw new AssertionError();
+ }
+
+ public long getItemId(int position) {
+ throw new AssertionError();
+ }
+
+ public View getView(int position, View convertView,
+ ViewGroup parent) {
+ throw new AssertionError();
+ }
+ });
+ }
+ }
+
+ private static final int UPLOAD_ID = Menu.FIRST;
+ private static final int CLEAR_ID = Menu.FIRST + 1;
+
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+
+ menu.add(0, UPLOAD_ID, 0, R.string.menu_upload_exceptions);
+ menu.add(0, CLEAR_ID, 0, R.string.menu_clear_exceptions);
+
+ return true;
+ }
+
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle all of the possible menu actions.
+ switch (item.getItemId()) {
+ case UPLOAD_ID:
+ sendBroadcast(new Intent(Checkin.TriggerIntent.ACTION));
+ break;
+ case CLEAR_ID:
+ getContentResolver().delete(
+ Checkin.Crashes.CONTENT_URI, null, null);
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ static class CrashListItem extends TextView {
+ CrashData crashData = null;
+
+ public CrashListItem(Context context) {
+ super(context);
+ setTextSize(10);
+ setTypeface(Typeface.MONOSPACE);
+ }
+
+ public CrashData getCrashData() {
+ return crashData;
+ }
+
+ public void setCrashData(CrashData crashData) {
+ this.crashData = crashData;
+ }
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View view, int pos, long id) {
+ // TODO: Use a generic VIEW action on the crash's content URI.
+ CrashData crash = ((CrashListItem) view).getCrashData();
+ if (crash != null) {
+ Intent intent = new Intent();
+ intent.setClass(this, StacktraceViewer.class);
+ intent.putExtra(
+ CrashData.class.getName(),
+ crash.getThrowableData().toString());
+ startActivity(intent);
+ }
+ }
+}
diff --git a/apps/Development/src/com/android/development/GLSTester.java b/apps/Development/src/com/android/development/GLSTester.java
new file mode 100644
index 0000000..4995b4d
--- /dev/null
+++ b/apps/Development/src/com/android/development/GLSTester.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import com.google.android.googleapps.GoogleLoginCredentialsResult;
+import com.google.android.googlelogin.GoogleLoginServiceConstants;
+import com.google.android.googleapps.IGoogleLoginService;
+import com.google.android.googleapps.LoginData;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.Spinner;
+
+/**
+ * Using a LogTextBox to display a scrollable text area
+ * to which text is appended.
+ *
+ */
+public class GLSTester extends Activity {
+
+ private static final String TAG = "GLSTester";
+
+ private LogTextBox mText;
+
+ private IGoogleLoginService mGls = null;
+ private ServiceConnection mConnection = null;
+
+ CheckBox mDoNotify = null;
+ CheckBox mRunIntent = null;
+ Spinner mService = null;
+ EditText mUsernameEdit = null;
+
+ private class Listener implements View.OnClickListener {
+ public Listener() {
+ }
+
+ public void onClick(View v) {
+ if (mGls == null) {
+ mText.append("mGls is null\n");
+ return;
+ }
+ try {
+ String service = (String) mService.getSelectedItem();
+ mText.append("service: " + service + "\n");
+
+ String account = mUsernameEdit.getText().toString();
+ if (account.length() == 0) {
+ account = null;
+ }
+ mText.append("account: " + account + "\n");
+ GoogleLoginCredentialsResult result =
+ mGls.blockingGetCredentials(account, service, mDoNotify.isChecked());
+ mText.append("result account: " + result.getAccount() + "\n");
+ mText.append("result string: " + result.getCredentialsString() + "\n");
+ Intent intent = result.getCredentialsIntent();
+ mText.append("result intent: " + intent + "\n");
+
+ if (intent != null && mRunIntent.isChecked()) {
+ startActivityForResult(intent, 0);
+ }
+ } catch (RemoteException e) {
+ mText.append("caught exception " + e + "\n");
+ }
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ mText.append("resultCode: " + resultCode + "\n");
+ if (data != null) {
+ mText.append("account: " +
+ data.getStringExtra(GoogleLoginServiceConstants.AUTH_ACCOUNT_KEY) + "\n");
+ mText.append("authtoken: " +
+ data.getStringExtra(GoogleLoginServiceConstants.AUTHTOKEN_KEY) + "\n");
+ } else {
+ mText.append("intent is null");
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Open a connection to the Google Login Service. Return the account.
+ mConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ mGls = IGoogleLoginService.Stub.asInterface(service);
+ }
+ public void onServiceDisconnected(ComponentName className) {
+ mGls = null;
+ }
+ };
+
+ bindService(GoogleLoginServiceConstants.SERVICE_INTENT,
+ mConnection, Context.BIND_AUTO_CREATE);
+
+ setContentView(R.layout.gls_tester);
+
+ mText = (LogTextBox) findViewById(R.id.text);
+ mText.append("Hello, world!\n");
+ Log.v(TAG, "hello, world!");
+
+ mDoNotify = (CheckBox) findViewById(R.id.do_notification);
+ mRunIntent = (CheckBox) findViewById(R.id.run_intent);
+ mRunIntent.setChecked(true);
+
+ mService = (Spinner) findViewById(R.id.service_spinner);
+
+ mUsernameEdit = (EditText) findViewById(R.id.username_edit);
+
+ Button b;
+ b = (Button) findViewById(R.id.require_google);
+ b.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ try {
+ String account = mGls.getAccount(GoogleLoginServiceConstants.REQUIRE_GOOGLE);
+ mText.append("REQUIRE_GOOGLE gave: " + account + "\n");
+ mUsernameEdit.setText(account == null ? "" : account);
+ } catch (RemoteException e) {
+ mText.append("exception: " + e + "\n");
+ }
+ } });
+
+ b = (Button) findViewById(R.id.prefer_hosted);
+ b.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ try {
+ String account = mGls.getAccount(GoogleLoginServiceConstants.PREFER_HOSTED);
+ mText.append("PREFER_HOSTED gave: " + account + "\n");
+ mUsernameEdit.setText(account == null ? "" : account);
+ } catch (RemoteException e) {
+ mText.append("exception: " + e + "\n");
+ }
+ } });
+
+
+ b = (Button) findViewById(R.id.get_accounts);
+ b.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ try {
+ String[] accounts = mGls.getAccounts();
+ mText.append("account list: (" + accounts.length + " entries)\n");
+ for (String username: accounts) {
+ mText.append(" " + username + "\n");
+ }
+ } catch (RemoteException e) {
+ mText.append("exception: " + e + "\n");
+ }
+ } });
+
+ b = (Button) findViewById(R.id.clear);
+ b.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ mText.setText("");
+ } });
+
+ b = (Button) findViewById(R.id.go);
+ b.setOnClickListener(new Listener());
+
+ b = (Button) findViewById(R.id.wipe_passwords);
+ b.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ mText.setText("wiping passwords:\n");
+ try {
+ String[] accounts = mGls.getAccounts();
+ LoginData ld = new LoginData();
+ for (String username: accounts) {
+ ld.mUsername = username;
+ mGls.updatePassword(ld);
+ mText.append(" " + username + "\n");
+ }
+ mText.append("done.\n");
+ } catch (RemoteException e) {
+ mText.append("caught exception " + e + "\n");
+ }
+ } });
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unbindService(mConnection);
+ }
+}
diff --git a/apps/Development/src/com/android/development/IRemoteService.aidl b/apps/Development/src/com/android/development/IRemoteService.aidl
new file mode 100644
index 0000000..0a60d34
--- /dev/null
+++ b/apps/Development/src/com/android/development/IRemoteService.aidl
@@ -0,0 +1,24 @@
+/* //device/samples/SampleCode/src/com/android/development/IRemoteService.aidl
+**
+** Copyright 2007, 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.android.development;
+
+interface IRemoteService
+{
+ int getPid();
+}
+
diff --git a/apps/Development/src/com/android/development/InstrumentationList.java b/apps/Development/src/com/android/development/InstrumentationList.java
new file mode 100644
index 0000000..88f09f8
--- /dev/null
+++ b/apps/Development/src/com/android/development/InstrumentationList.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.ActivityManagerNative;
+import android.app.IInstrumentationWatcher;
+import android.app.ListActivity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.Collections;
+import java.util.List;
+
+class InstrumentationAdapter extends BaseAdapter
+{
+ private PackageManager mPM;
+
+ public InstrumentationAdapter(Context context, String targetPackage)
+ {
+ mContext = context;
+ mTargetPackage = targetPackage;
+ mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mPM = context.getPackageManager();
+
+ mList = context.getPackageManager().queryInstrumentation(mTargetPackage, 0);
+ if (mList != null) {
+ Collections.sort(mList, new InstrumentationInfo.DisplayNameComparator(mPM));
+ }
+ }
+
+ public ComponentName instrumentationForPosition(int position)
+ {
+ if (mList == null) {
+ return null;
+ }
+ InstrumentationInfo ii = mList.get(position);
+ return new ComponentName(ii.packageName, ii.name);
+ }
+
+ public int getCount()
+ {
+ return mList != null ? mList.size() : 0;
+ }
+
+ public Object getItem(int position)
+ {
+ return position;
+ }
+
+ public long getItemId(int position)
+ {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent)
+ {
+ View view;
+ if (convertView == null) {
+ view = mInflater.inflate(
+ android.R.layout.simple_list_item_1, parent, false);
+ } else {
+ view = convertView;
+ }
+ bindView(view, mList.get(position));
+ return view;
+ }
+
+ private final void bindView(View view, InstrumentationInfo info)
+ {
+ TextView text = (TextView)view.findViewById(android.R.id.text1);
+ CharSequence label = info.loadLabel(mPM);
+ text.setText(label != null ? label : info.name);
+ }
+
+ protected final Context mContext;
+ protected final String mTargetPackage;
+ protected final LayoutInflater mInflater;
+
+ protected List<InstrumentationInfo> mList;
+}
+
+public class InstrumentationList extends ListActivity
+{
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mProfilingMode = icicle != null && icicle.containsKey("profiling");
+ setListAdapter(new InstrumentationAdapter(this, null));
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu)
+ {
+ super.onCreateOptionsMenu(menu);
+ mProfilingItem = menu.add(0, 0, 0, "Profiling Mode")
+ .setOnMenuItemClickListener(mProfilingCallback);
+ mProfilingItem.setCheckable(true);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu)
+ {
+ super.onPrepareOptionsMenu(menu);
+ mProfilingItem.setChecked(mProfilingMode);
+ return true;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState)
+ {
+ if (mProfilingMode) {
+ outState.putBoolean("profiling", true);
+ }
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id)
+ {
+ ComponentName className = ((InstrumentationAdapter)getListAdapter()).
+ instrumentationForPosition(position);
+ if (className != null) {
+ String profilingFile = null;
+ if (mProfilingMode) {
+ profilingFile = "/tmp/trace/" + className + ".dmtrace";
+ }
+ try {
+ ActivityManagerNative.getDefault().
+ startInstrumentation(className, profilingFile, 0, null, mWatcher);
+ } catch (RemoteException ex) {
+ }
+ }
+ }
+
+ private MenuItem.OnMenuItemClickListener mProfilingCallback =
+ new MenuItem.OnMenuItemClickListener()
+ {
+ public boolean onMenuItemClick(MenuItem item) {
+ mProfilingMode = !mProfilingMode;
+ return true;
+ }
+ };
+
+ private IInstrumentationWatcher mWatcher = new IInstrumentationWatcher.Stub() {
+
+ public void instrumentationStatus(ComponentName name, int resultCode, Bundle results) {
+ if (results != null) {
+ for (String key : results.keySet()) {
+ Log.i("instrumentation",
+ "INSTRUMENTATION_STATUS_RESULT: " + key + "=" + results.get(key));
+ }
+ }
+ Log.i("instrumentation", "INSTRUMENTATION_STATUS_CODE: " + resultCode);
+ }
+ public void instrumentationFinished(ComponentName name,
+ int resultCode, Bundle results) {
+ if (results != null) {
+ for (String key : results.keySet()) {
+ Log.i("instrumentation",
+ "INSTRUMENTATION_RESULT: " + key + "=" + results.get(key));
+ }
+ }
+ Log.i("instrumentation", "INSTRUMENTATION_CODE: " + resultCode);
+ }
+ };
+
+ private MenuItem mProfilingItem;
+ private boolean mProfilingMode;
+}
diff --git a/apps/Development/src/com/android/development/LogTextBox.java b/apps/Development/src/com/android/development/LogTextBox.java
new file mode 100644
index 0000000..2f99ab2
--- /dev/null
+++ b/apps/Development/src/com/android/development/LogTextBox.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.widget.TextView;
+import android.content.Context;
+import android.text.method.ScrollingMovementMethod;
+import android.text.method.MovementMethod;
+import android.text.method.KeyListener;
+import android.text.method.TransformationMethod;
+import android.text.Editable;
+import android.util.AttributeSet;
+
+
+/**
+ * This is a TextView that is Editable and by default scrollable,
+ * like EditText without a cursor.
+ *
+ * <p>
+ * <b>XML attributes</b>
+ * <p>
+ * See
+ * {@link android.R.styleable#TextView TextView Attributes},
+ * {@link android.R.styleable#View View Attributes}
+ */
+public class LogTextBox extends TextView {
+ public LogTextBox(Context context) {
+ this(context, null);
+ }
+
+ public LogTextBox(Context context, AttributeSet attrs) {
+ this(context, attrs, android.R.attr.textViewStyle);
+ }
+
+ public LogTextBox(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @Override
+ protected boolean getDefaultEditable() {
+ return true;
+ }
+
+ @Override
+ protected MovementMethod getDefaultMovementMethod() {
+ return ScrollingMovementMethod.getInstance();
+ }
+
+ @Override
+ public Editable getText() {
+ return (Editable) super.getText();
+ }
+
+ @Override
+ public void setText(CharSequence text, BufferType type) {
+ super.setText(text, BufferType.EDITABLE);
+ }
+}
diff --git a/apps/Development/src/com/android/development/LogViewer.java b/apps/Development/src/com/android/development/LogViewer.java
new file mode 100644
index 0000000..aadc0d4
--- /dev/null
+++ b/apps/Development/src/com/android/development/LogViewer.java
@@ -0,0 +1,169 @@
+/*
+** Copyright 2007, 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.android.development;
+
+import static com.android.internal.util.CharSequences.forAsciiBytes;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.FileOutputStream;
+import java.net.Socket;
+
+import android.app.Activity;
+import android.os.Handler;
+import android.os.Bundle;
+import android.util.Log;
+import android.graphics.Typeface;
+import android.view.Gravity;
+
+/**
+ * Views the device log.
+ */
+public class LogViewer extends Activity {
+
+ static final String TAG = LogViewer.class.getSimpleName();
+
+ FileOutputStream logger;
+
+ volatile boolean active = true;
+ Handler handler;
+ LogTextBox text;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.log_viewer);
+ this.handler = new Handler();
+
+ text = (LogTextBox) findViewById(R.id.text);
+
+ text.setTextSize(10);
+ text.setHorizontallyScrolling(true);
+ text.setTypeface(Typeface.MONOSPACE);
+ text.setGravity(Gravity.BOTTOM | Gravity.LEFT);
+
+ this.active = true;
+ try {
+ logger = new FileOutputStream("/tmp/logviewer.txt");
+ new Thread(new LogReader()).start();
+ } catch (IOException e) {
+ appendThrowable(e);
+ }
+ }
+
+ private void appendThrowable(Throwable t) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Error reading log: ");
+ builder.append(Log.getStackTraceString(t));
+ text.getText().append(builder);
+ }
+
+ private class LogReader implements Runnable {
+
+ final Socket socket;
+ final DataInputStream in;
+ StringBuilder builder = new StringBuilder();
+ long lastTime = System.currentTimeMillis();
+
+ private static final int HEADER_SIZE = 24;
+
+ public LogReader() throws IOException {
+ this.socket = new Socket("127.0.0.1", 5040);
+ this.in = new DataInputStream(this.socket.getInputStream());
+ // Write two newlines to indicate "no reader args"
+ this.socket.getOutputStream().write('\n');
+ this.socket.getOutputStream().write('\n');
+ }
+
+ public void run() {
+ while (active) {
+ try {
+ while (in.available() > 0) {
+ logger.write("Reading message.\n".getBytes());
+
+ int length = in.readInt();
+ byte[] bytes = new byte[length];
+ in.readFully(bytes);
+
+ int tagEnd = next0(bytes, HEADER_SIZE);
+ int fileEnd = next0(bytes, tagEnd + 1);
+ int messageEnd = next0(bytes, fileEnd + 1);
+
+ CharSequence tag
+ = forAsciiBytes(bytes, HEADER_SIZE, tagEnd);
+ CharSequence message
+ = forAsciiBytes(bytes, fileEnd + 1, messageEnd);
+
+ builder.append(tag)
+ .append(": ")
+ .append(message)
+ .append("\n");
+ }
+
+ logger.write("Updating UI.\n".getBytes());
+ handler.post(new AppendCharacters(builder));
+ builder = new StringBuilder();
+
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {}
+ } catch (final IOException e) {
+ handler.post(new AppendThrowable(e));
+ }
+ }
+ }
+ }
+
+ static int next0(byte[] bytes, int start) {
+ for (int current = start; current < bytes.length; current++) {
+ if (bytes[current] == 0)
+ return current;
+ }
+ return bytes.length;
+ }
+
+ private class AppendThrowable implements Runnable {
+
+ private final Throwable t;
+
+ public AppendThrowable(Throwable t) {
+ this.t = t;
+ }
+
+ public void run() {
+ appendThrowable(t);
+ }
+ }
+
+ private class AppendCharacters implements Runnable {
+
+ private final CharSequence message;
+
+ public AppendCharacters(CharSequence message) {
+ this.message = message;
+ }
+
+ public void run() {
+ text.getText().append(message);
+// try {
+// logger.write(builder.toString().getBytes());
+// } catch (IOException e) {
+// appendThrowable(e);
+// }
+ }
+ }
+}
diff --git a/apps/Development/src/com/android/development/MediaScannerActivity.java b/apps/Development/src/com/android/development/MediaScannerActivity.java
new file mode 100644
index 0000000..f78910a
--- /dev/null
+++ b/apps/Development/src/com/android/development/MediaScannerActivity.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.BroadcastReceiver;
+import android.net.Uri;
+import android.os.Environment;
+import android.widget.TextView;
+
+public class MediaScannerActivity extends Activity
+{
+ public MediaScannerActivity() {
+ }
+
+ /** Called when the activity is first created or resumed. */
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ setContentView(R.layout.media_scanner_activity);
+
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
+ intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
+ intentFilter.addDataScheme("file");
+ registerReceiver(mReceiver, intentFilter);
+
+ sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ + Environment.getExternalStorageDirectory())));
+
+ mTitle = (TextView) findViewById(R.id.title);
+ mTitle.setText("Sent ACTION_MEDIA_MOUNTED to trigger the Media Scanner.");
+ }
+
+ /** Called when the activity going into the background or being destroyed. */
+ @Override
+ public void onPause() {
+ super.onPause();
+ unregisterReceiver(mReceiver);
+ }
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) {
+ mTitle.setText("Media Scanner started scanning " + intent.getData().getPath());
+ }
+ else if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
+ mTitle.setText("Media Scanner finished scanning " + intent.getData().getPath());
+ }
+ }
+ };
+
+ private TextView mTitle;
+}
diff --git a/apps/Development/src/com/android/development/PackageBrowser.java b/apps/Development/src/com/android/development/PackageBrowser.java
new file mode 100644
index 0000000..e4c233f
--- /dev/null
+++ b/apps/Development/src/com/android/development/PackageBrowser.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.AlertDialog;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.pm.IPackageDeleteObserver;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.BroadcastReceiver;
+import android.content.pm.PackageInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.Handler;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.text.Collator;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class PackageBrowser extends ListActivity
+{
+ private PackageListAdapter mAdapter;
+ private List<PackageInfo> mPackageInfoList = null;
+ private Handler mHandler;
+
+ public class PackageListAdapter extends ArrayAdapter<PackageInfo>
+ {
+
+ public PackageListAdapter(Context context)
+ {
+ super(context, android.R.layout.simple_list_item_1);
+ mPackageInfoList = context.getPackageManager().getInstalledPackages(0);
+ if (mPackageInfoList != null) {
+ Collections.sort(mPackageInfoList, sDisplayNameComparator);
+ }
+ setSource(mPackageInfoList);
+ }
+
+ @Override
+ public void bindView(View view, PackageInfo info)
+ {
+ TextView text = (TextView)view.findViewById(android.R.id.text1);
+ text.setText(info.packageName);
+ }
+ }
+
+ /**
+ * Receives notifications when applications are added/removed.
+ */
+ private class ApplicationsIntentReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // todo: this is a bit brute force. We should probably get the action and package name
+ // from the intent and just add to or delete from the mPackageInfoList
+ setupAdapter();
+ }
+ }
+
+ private final static Comparator sDisplayNameComparator = new Comparator() {
+ public final int
+ compare(Object a, Object b)
+ {
+ CharSequence sa = ((PackageInfo) a).packageName;
+ CharSequence sb = ((PackageInfo) b).packageName;
+ return collator.compare(sa, sb);
+ }
+
+ private final Collator collator = Collator.getInstance();
+ };
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setupAdapter();
+ mHandler= new Handler();
+ registerIntentReceivers();
+ }
+
+ private void setupAdapter() {
+ mAdapter = new PackageListAdapter(this);
+ setListAdapter(mAdapter);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ menu.add(0, 0, 0, "Delete package").setOnMenuItemClickListener(
+ new MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ deletePackage();
+ return true;
+ }
+ });
+ return true;
+ }
+
+ private void deletePackage() {
+ final int curSelection = getSelectedItemPosition();
+ if (curSelection >= 0) {
+ // todo: verification dialog for package deletion
+ final PackageInfo packageInfo = mAdapter.itemForPosition(curSelection);
+ if (packageInfo != null) {
+ getPackageManager().deletePackage(packageInfo.packageName,
+ new IPackageDeleteObserver.Stub() {
+ public void packageDeleted(boolean succeeded) throws RemoteException {
+ if (succeeded) {
+ mPackageInfoList.remove(curSelection);
+ mHandler.post(new Runnable() {
+ public void run() {
+ mAdapter.notifyDataSetChanged();
+ }
+ });
+
+ // todo: verification dialog for data directory
+ final String dataPath = packageInfo.applicationInfo.dataDir;
+ // todo: delete the data directory
+ } else {
+ mHandler.post(new Runnable() {
+ public void run() {
+ new AlertDialog.Builder(PackageBrowser.this)
+ .setTitle("Oops")
+ .setMessage("Could not delete package." +
+ " Maybe it is in /system/app rather than /data/app?")
+ .show();
+ }
+ });
+
+ }
+ }
+ },
+ 0);
+ }
+ }
+ }
+
+ private void registerIntentReceivers() {
+ IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ filter.addDataScheme("package");
+ registerReceiver(new ApplicationsIntentReceiver(), filter);
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id)
+ {
+ PackageInfo info =
+ mAdapter.itemForPosition(position);
+ if (info != null) {
+ Intent intent = new Intent(
+ null, Uri.fromParts("package", info.packageName, null));
+ intent.setClass(this, PackageSummary.class);
+ startActivity(intent);
+ }
+ }
+}
diff --git a/apps/Development/src/com/android/development/PackageSummary.java b/apps/Development/src/com/android/development/PackageSummary.java
new file mode 100644
index 0000000..a6bbbb2
--- /dev/null
+++ b/apps/Development/src/com/android/development/PackageSummary.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ServiceInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+
+public class PackageSummary extends Activity {
+
+ String mPackageName;
+ private TextView mPackage;
+ private ImageView mIconImage;
+ private TextView mClass;
+ private TextView mLabel;
+ private View mDisabled;
+ private View mSystem;
+ private View mDebuggable;
+ private View mNoCode;
+ private View mPersistent;
+ private Button mRestart;
+ private TextView mTask;
+ private TextView mVersion;
+ private TextView mProcess;
+ private TextView mUid;
+ private TextView mSource;
+ private TextView mData;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.package_summary);
+
+ final PackageManager pm = getPackageManager();
+
+ mPackage = (TextView)findViewById(R.id.packageView);
+ mIconImage = (ImageView)findViewById(R.id.icon);
+ mClass = (TextView)findViewById(R.id.classView);
+ mLabel = (TextView)findViewById(R.id.label);
+ mDisabled = findViewById(R.id.disabled);
+ mSystem = findViewById(R.id.system);
+ mDebuggable = findViewById(R.id.debuggable);
+ mNoCode = findViewById(R.id.nocode);
+ mPersistent = findViewById(R.id.persistent);
+ mRestart = (Button)findViewById(R.id.restart);
+ mTask = (TextView)findViewById(R.id.task);
+ mVersion = (TextView)findViewById(R.id.version);
+ mUid = (TextView)findViewById(R.id.uid);
+ mProcess = (TextView)findViewById(R.id.process);
+ mSource = (TextView)findViewById(R.id.source);
+ mData = (TextView)findViewById(R.id.data);
+
+ mPackageName = getIntent().getData().getSchemeSpecificPart();
+ PackageInfo info = null;
+ try {
+ info = pm.getPackageInfo(mPackageName,
+ PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS
+ | PackageManager.GET_SERVICES | PackageManager.GET_PROVIDERS
+ | PackageManager.GET_INSTRUMENTATION);
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+
+ if (info != null) {
+ mPackage.setText(info.packageName);
+ CharSequence label = null;
+ String appClass = null;
+ if (info.applicationInfo != null) {
+ mIconImage.setImageDrawable(
+ pm.getApplicationIcon(info.applicationInfo));
+ label = info.applicationInfo.nonLocalizedLabel;
+ appClass = info.applicationInfo.className;
+ if (info.applicationInfo.enabled) {
+ mDisabled.setVisibility(View.GONE);
+ }
+ if ((info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
+ mSystem.setVisibility(View.GONE);
+ }
+ if ((info.applicationInfo.flags&ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
+ mDebuggable.setVisibility(View.GONE);
+ }
+ if ((info.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0) {
+ mNoCode.setVisibility(View.GONE);
+ }
+ if ((info.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) {
+ mPersistent.setVisibility(View.GONE);
+ }
+ mUid.setText(Integer.toString(info.applicationInfo.uid));
+ mProcess.setText(info.applicationInfo.processName);
+ if (info.versionName != null) {
+ mVersion.setText(info.versionName + " (#" + info.versionCode + ")");
+ } else {
+ mVersion.setText("(#" + info.versionCode + ")");
+ }
+ mSource.setText(info.applicationInfo.sourceDir);
+ mData.setText(info.applicationInfo.dataDir);
+ if (info.applicationInfo.taskAffinity != null) {
+ mTask.setText("\"" + info.applicationInfo.taskAffinity + "\"");
+ } else {
+ mTask.setText("(No Task Affinity)");
+ }
+ }
+ if (appClass != null) {
+ if (appClass.startsWith(info.packageName + "."))
+ mClass.setText(appClass.substring(info.packageName.length()));
+ else
+ mClass.setText(appClass);
+ } else {
+ mClass.setText("(No Application Class)");
+ }
+ if (label != null) {
+ mLabel.setText("\"" + label + "\"");
+ } else {
+ mLabel.setText("(No Label)");
+ }
+
+ mRestart.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ try {
+ ActivityManagerNative.getDefault().restartPackage(mPackageName);
+ } catch (RemoteException e) {
+ }
+ }
+ });
+
+ final LayoutInflater inflate =
+ (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.WRAP_CONTENT,
+ LinearLayout.LayoutParams.WRAP_CONTENT);
+ LinearLayout activities = (LinearLayout)findViewById(R.id.activities);
+ LinearLayout receivers = (LinearLayout)findViewById(R.id.receivers);
+ LinearLayout services = (LinearLayout)findViewById(R.id.services);
+ LinearLayout providers = (LinearLayout)findViewById(R.id.providers);
+ LinearLayout instrumentation = (LinearLayout)findViewById(R.id.instrumentation);
+
+ if (info.activities != null) {
+ final int N = info.activities.length;
+ for (int i=0; i<N; i++) {
+ ActivityInfo ai = info.activities[i];
+ // If an activity is disabled then the ActivityInfo will be null
+ if (ai != null) {
+ Button view = (Button)inflate.inflate(
+ R.layout.package_item, null, false);
+ view.setOnClickListener(new ActivityOnClick(
+ new ComponentName(ai.applicationInfo.packageName,
+ ai.name)));
+ setItemText(view, info, ai.name);
+ activities.addView(view, lp);
+ }
+ }
+ } else {
+ activities.setVisibility(View.GONE);
+ }
+
+ if (info.receivers != null) {
+ final int N = info.receivers.length;
+ for (int i=0; i<N; i++) {
+ ActivityInfo ai = info.receivers[i];
+ Button view = (Button)inflate.inflate(
+ R.layout.package_item, null, false);
+ setItemText(view, info, ai.name);
+ receivers.addView(view, lp);
+ }
+ } else {
+ receivers.setVisibility(View.GONE);
+ }
+
+ if (info.services != null) {
+ final int N = info.services.length;
+ for (int i=0; i<N; i++) {
+ ServiceInfo si = info.services[i];
+ Button view = (Button)inflate.inflate(
+ R.layout.package_item, null, false);
+ setItemText(view, info, si.name);
+ services.addView(view, lp);
+ }
+ } else {
+ services.setVisibility(View.GONE);
+ }
+
+ if (info.providers != null) {
+ final int N = info.providers.length;
+ for (int i=0; i<N; i++) {
+ ProviderInfo pi = info.providers[i];
+ Button view = (Button)inflate.inflate(
+ R.layout.package_item, null, false);
+ setItemText(view, info, pi.name);
+ providers.addView(view, lp);
+ }
+ } else {
+ providers.setVisibility(View.GONE);
+ }
+
+ if (info.instrumentation != null) {
+ final int N = info.instrumentation.length;
+ for (int i=0; i<N; i++) {
+ InstrumentationInfo ii = info.instrumentation[i];
+ Button view = (Button)inflate.inflate(
+ R.layout.package_item, null, false);
+ setItemText(view, info, ii.name);
+ instrumentation.addView(view, lp);
+ }
+ } else {
+ instrumentation.setVisibility(View.GONE);
+ }
+
+ }
+
+ // Put focus here, so a button doesn't get focus and cause the
+ // scroll view to move to it.
+ mPackage.requestFocus();
+ }
+
+ private final static void setItemText(Button item, PackageInfo pi,
+ String className)
+ {
+ item.setText(className.substring(pi.packageName.length()+1));
+ }
+
+ private final class ActivityOnClick implements View.OnClickListener
+ {
+ private final ComponentName mClassName;
+ ActivityOnClick(ComponentName className) {
+ mClassName = className;
+ }
+
+ public void onClick(View v) {
+ Intent intent = new Intent(
+ null, Uri.fromParts("component",
+ mClassName.flattenToString(), null));
+ intent.setClass(PackageSummary.this, ShowActivity.class);
+ startActivity(intent);
+ }
+ }
+}
diff --git a/apps/Development/src/com/android/development/PointerLocation.java b/apps/Development/src/com/android/development/PointerLocation.java
new file mode 100644
index 0000000..668e9ba
--- /dev/null
+++ b/apps/Development/src/com/android/development/PointerLocation.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Paint.FontMetricsInt;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.WindowManager;
+import android.view.VelocityTracker;
+import android.view.View;
+
+import java.util.ArrayList;
+
+/**
+ * Demonstrates wrapping a layout in a ScrollView.
+ *
+ */
+public class PointerLocation extends Activity {
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(new MyView(this));
+
+ // Make the screen full bright for this activity.
+ WindowManager.LayoutParams lp = getWindow().getAttributes();
+ lp.screenBrightness = 1.0f;
+ getWindow().setAttributes(lp);
+ }
+
+ public class MyView extends View {
+ private final Paint mTextPaint;
+ private final Paint mTextBackgroundPaint;
+ private final Paint mTextLevelPaint;
+ private final Paint mPaint;
+ private final Paint mTargetPaint;
+ private final FontMetricsInt mTextMetrics = new FontMetricsInt();
+ private final ArrayList<Float> mXs = new ArrayList<Float>();
+ private final ArrayList<Float> mYs = new ArrayList<Float>();
+ private int mHeaderBottom;
+ private boolean mCurDown;
+ private int mCurX;
+ private int mCurY;
+ private float mCurPressure;
+ private float mCurSize;
+ private int mCurWidth;
+ private VelocityTracker mVelocity;
+
+ public MyView(Context c) {
+ super(c);
+ mTextPaint = new Paint();
+ mTextPaint.setAntiAlias(true);
+ mTextPaint.setTextSize(10);
+ mTextPaint.setARGB(255, 0, 0, 0);
+ mTextBackgroundPaint = new Paint();
+ mTextBackgroundPaint.setAntiAlias(false);
+ mTextBackgroundPaint.setARGB(128, 255, 255, 255);
+ mTextLevelPaint = new Paint();
+ mTextLevelPaint.setAntiAlias(false);
+ mTextLevelPaint.setARGB(192, 255, 0, 0);
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setARGB(255, 255, 255, 255);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeWidth(2);
+ mTargetPaint = new Paint();
+ mTargetPaint.setAntiAlias(false);
+ mTargetPaint.setARGB(192, 0, 0, 255);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeWidth(1);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ mTextPaint.getFontMetricsInt(mTextMetrics);
+ mHeaderBottom = -mTextMetrics.ascent+mTextMetrics.descent+2;
+ Log.i("foo", "Metrics: ascent=" + mTextMetrics.ascent
+ + " descent=" + mTextMetrics.descent
+ + " leading=" + mTextMetrics.leading
+ + " top=" + mTextMetrics.top
+ + " bottom=" + mTextMetrics.bottom);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ int w = getWidth()/5;
+ int base = -mTextMetrics.ascent+1;
+ int bottom = mHeaderBottom;
+ canvas.drawRect(0, 0, w-1, bottom, mTextBackgroundPaint);
+ canvas.drawText("X: " + mCurX, 1, base, mTextPaint);
+ canvas.drawRect(w, 0, (w * 2) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawText("Y: " + mCurY, 1 + w, base, mTextPaint);
+ canvas.drawRect(w * 2, 0, (w * 3) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawRect(w * 2, 0, (w * 2) + (mCurPressure * w) - 1, bottom, mTextLevelPaint);
+ canvas.drawText("Pres: " + mCurPressure, 1 + w * 2, base, mTextPaint);
+ canvas.drawRect(w * 3, 0, (w * 4) - 1, bottom, mTextBackgroundPaint);
+ canvas.drawRect(w * 3, 0, (w * 3) + (mCurSize * w) - 1, bottom, mTextLevelPaint);
+ canvas.drawText("Size: " + mCurSize, 1 + w * 3, base, mTextPaint);
+ canvas.drawRect(w * 4, 0, getWidth(), bottom, mTextBackgroundPaint);
+ int velocity = mVelocity == null ? 0 : (int) (mVelocity.getYVelocity() * 1000);
+ canvas.drawText("yVel: " + velocity, 1 + w * 4, base, mTextPaint);
+
+ final int N = mXs.size();
+ float lastX=0, lastY=0;
+ mPaint.setARGB(255, 0, 255, 255);
+ for (int i=0; i<N; i++) {
+ float x = mXs.get(i);
+ float y = mYs.get(i);
+ if (i > 0) {
+ canvas.drawLine(lastX, lastY, x, y, mTargetPaint);
+ canvas.drawPoint(lastX, lastY, mPaint);
+ }
+ lastX = x;
+ lastY = y;
+ }
+ if (mVelocity != null) {
+ mPaint.setARGB(255, 255, 0, 0);
+ float xVel = mVelocity.getXVelocity() * (1000/60);
+ float yVel = mVelocity.getYVelocity() * (1000/60);
+ canvas.drawLine(lastX, lastY, lastX+xVel, lastY+yVel, mPaint);
+ } else {
+ canvas.drawPoint(lastX, lastY, mPaint);
+ }
+
+ if (mCurDown) {
+ canvas.drawLine(0, (int)mCurY, getWidth(), (int)mCurY, mTargetPaint);
+ canvas.drawLine((int)mCurX, 0, (int)mCurX, getHeight(), mTargetPaint);
+ int pressureLevel = (int)(mCurPressure*255);
+ mPaint.setARGB(255, pressureLevel, 128, 255-pressureLevel);
+ canvas.drawPoint(mCurX, mCurY, mPaint);
+ canvas.drawCircle(mCurX, mCurY, mCurWidth, mPaint);
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ int action = event.getAction();
+ //mRect.set(0, 0, getWidth(), mHeaderBottom+1);
+ //invalidate(mRect);
+ //if (mCurDown) {
+ // mRect.set(mCurX-mCurWidth-3, mCurY-mCurWidth-3,
+ // mCurX+mCurWidth+3, mCurY+mCurWidth+3);
+ //} else {
+ // mRect.setEmpty();
+ //}
+ if (action == MotionEvent.ACTION_DOWN) {
+ mXs.clear();
+ mYs.clear();
+ mVelocity = VelocityTracker.obtain();
+ }
+ mVelocity.addMovement(event);
+ mVelocity.computeCurrentVelocity(1);
+ final int N = event.getHistorySize();
+ for (int i=0; i<N; i++) {
+ mXs.add(event.getHistoricalX(i));
+ mYs.add(event.getHistoricalY(i));
+ }
+ mXs.add(event.getX());
+ mYs.add(event.getY());
+ mCurDown = action == MotionEvent.ACTION_DOWN
+ || action == MotionEvent.ACTION_MOVE;
+ mCurX = (int)event.getX();
+ mCurY = (int)event.getY();
+ mCurPressure = event.getPressure();
+ mCurSize = event.getSize();
+ mCurWidth = (int)(mCurSize*(getWidth()/3));
+ //if (mCurDown) {
+ // mRect.union(mCurX-mCurWidth-3, mCurY-mCurWidth-3,
+ // mCurX+mCurWidth+3, mCurY+mCurWidth+3);
+ //}
+ //invalidate(mRect);
+ invalidate();
+ return true;
+ }
+
+ }
+}
diff --git a/apps/Development/src/com/android/development/ProcessInfo.java b/apps/Development/src/com/android/development/ProcessInfo.java
new file mode 100755
index 0000000..5ece1a4
--- /dev/null
+++ b/apps/Development/src/com/android/development/ProcessInfo.java
@@ -0,0 +1,62 @@
+/*
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class ProcessInfo extends Activity {
+ PackageManager mPm;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Intent intent = getIntent();
+ String processName = intent.getStringExtra("processName");
+ String pkgList[] = intent.getStringArrayExtra("packageList");
+ mPm = getPackageManager();
+ setContentView(R.layout.process_info);
+ TextView processNameView = (TextView) findViewById(R.id.process_name);
+ LinearLayout pkgListView = (LinearLayout) findViewById(R.id.package_list);
+ if(processName != null) {
+ processNameView.setText(processName);
+ }
+ if(pkgList != null) {
+ for(String pkg : pkgList) {
+ TextView pkgView = new TextView(this);
+ pkgView.setText(pkg);
+ pkgListView.addView(pkgView);
+ }
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ }
+}
+
diff --git a/apps/Development/src/com/android/development/RadioIssueReport.java b/apps/Development/src/com/android/development/RadioIssueReport.java
new file mode 100644
index 0000000..b1a95f4
--- /dev/null
+++ b/apps/Development/src/com/android/development/RadioIssueReport.java
@@ -0,0 +1,191 @@
+/*
+** Copyright 2006, 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.android.development;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.provider.Checkin;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneFactory;
+import android.telephony.ServiceState;
+import android.text.format.DateFormat;
+import static com.android.internal.util.CharSequences.forAsciiBytes;
+import android.util.Log;
+import android.view.View.OnClickListener;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import com.google.android.collect.Maps;
+
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.net.Socket;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Map;
+
+/**
+ * Report radio issues to the StatisticsService.
+ */
+public class RadioIssueReport extends Activity
+{
+ private static final String TAG = "RadioIssue";
+ private static final int HEADER_SIZE = 24;
+ private static final String RADIO_BUFFER_OPTIONS = "-b radio\n-d\n";
+
+ /** List of system properties to snapshot. */
+ private static String[] SYSTEM_PROPERTIES = {
+ "net.gsm.radio-reset",
+ "net.gsm.attempt-gprs",
+ "net.gsm.succeed-gprs",
+ "net.gsm.disconnect",
+ "net.ppp.sent",
+ "net.ppp.received",
+ "gsm.version.baseband",
+ "gsm.version.ril-impl",
+ };
+
+ private Button mSubmitButton;
+ private EditText mReportText;
+ private ServiceState mServiceState;
+ private Phone.State mPhoneState;
+ private int mSignalStrength;
+ private Phone.DataState mDataState;
+ private String mRadioLog;
+
+ /** Snapshot of interesting variables relevant to the radio. */
+ private Map<String, String> mRadioState;
+
+ @Override
+ public void
+ onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.radio_issue);
+
+ initSubmitButton();
+ initReportText();
+
+ mRadioState = snapState();
+ }
+
+ /**
+ * @return a snapshot of phone state variables to report.
+ */
+ private static Map<String, String> snapState() {
+ Map<String, String> state = Maps.newHashMap();
+
+ // Capture a bunch of system properties
+ for (String property: SYSTEM_PROPERTIES) {
+ String value = SystemProperties.get(property);
+ state.put(property, SystemProperties.get(property));
+ }
+
+ Phone phone = PhoneFactory.getDefaultPhone();
+ state.put("phone-data", phone.getDataConnectionState().toString());
+ state.put("phone-service", phone.getServiceState().toString());
+ state.put("phone-signal", String.valueOf(phone.getSignalStrengthASU()));
+ state.put("phone-state", phone.getState().toString());
+
+ try {
+ state.put("radio-log", getRadioLog());
+ } catch (IOException e) {
+ Log.e(TAG, "Error reading radio log", e);
+ }
+
+ return state;
+ }
+
+ private void initSubmitButton() {
+ mSubmitButton = (Button) findViewById(R.id.submit);
+ mSubmitButton.setOnClickListener(mSubmitButtonHandler);
+ }
+
+ private void initReportText() {
+ mReportText = (EditText) findViewById(R.id.report_text);
+ mReportText.requestFocus();
+ }
+
+ OnClickListener mSubmitButtonHandler = new OnClickListener() {
+ public void onClick(View v) {
+ // Include the user-supplied report text.
+ mRadioState.put("user-report", mReportText.getText().toString());
+
+ // Dump the state variables directly into the report.
+ Checkin.logEvent(getContentResolver(),
+ Checkin.Events.Tag.RADIO_BUG_REPORT,
+ mRadioState.toString());
+
+ finish();
+ }
+ };
+
+ // Largely stolen from LogViewer.java
+ private static String getRadioLog() throws IOException {
+ Socket sock = new Socket("127.0.0.1", 5040);
+ DataInputStream in = new DataInputStream(sock.getInputStream());
+ StringBuilder log = new StringBuilder();
+
+ // Set options
+ sock.getOutputStream().write(RADIO_BUFFER_OPTIONS.getBytes());
+ sock.getOutputStream().write('\n');
+ sock.getOutputStream().write('\n');
+
+ // Read in the log
+ try {
+ Calendar cal = new GregorianCalendar();
+
+ while (true) {
+ int length = in.readInt();
+ long when = (long)in.readInt();
+ byte[] bytes = new byte[length-4];
+ in.readFully(bytes);
+
+ int tagEnd = next0(bytes, HEADER_SIZE-4);
+ int fileEnd = next0(bytes, tagEnd + 1);
+ int messageEnd = next0(bytes, fileEnd + 1);
+
+ CharSequence tag
+ = forAsciiBytes(bytes, HEADER_SIZE-4, tagEnd);
+ CharSequence message
+ = forAsciiBytes(bytes, fileEnd + 1, messageEnd);
+
+ cal.setTimeInMillis(when*1000);
+ log.append(DateFormat.format("MM-dd kk:mm:ss ", cal));
+ log.append(tag)
+ .append(": ")
+ .append(message)
+ .append("\n");
+ }
+ } catch (EOFException e) {
+ Log.d(TAG, "reached end of stream");
+ }
+
+ return log.toString();
+ }
+
+ private static int next0(byte[] bytes, int start) {
+ for (int current = start; current < bytes.length; current++) {
+ if (bytes[current] == 0)
+ return current;
+ }
+ return bytes.length;
+ }
+}
diff --git a/apps/Development/src/com/android/development/RunningProcesses.java b/apps/Development/src/com/android/development/RunningProcesses.java
new file mode 100755
index 0000000..7b56be9
--- /dev/null
+++ b/apps/Development/src/com/android/development/RunningProcesses.java
@@ -0,0 +1,154 @@
+/*
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.ActivityManager;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class RunningProcesses extends ListActivity {
+ PackageManager mPm;
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mPm = getPackageManager();
+ mAdapter = new AppListAdapter(this);
+ if (mAdapter.getCount() <= 0) {
+ finish();
+ } else {
+ setListAdapter(mAdapter);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ }
+
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+ ListItem app = mAdapter.appForPosition(position);
+ // Create intent to start new activity
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setClass(this, ProcessInfo.class);
+ intent.putExtra("processName", app.procInfo.processName);
+ intent.putExtra("packageList", app.procInfo.pkgList);
+ // start new activity to display extended information
+ startActivity(intent);
+ }
+
+ private final class AppListAdapter extends BaseAdapter {
+ public AppListAdapter(Context context) {
+ mContext = context;
+ mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
+ List<ActivityManager.RunningAppProcessInfo> appList = am.getRunningAppProcesses();
+ for (ActivityManager.RunningAppProcessInfo app : appList) {
+ if(mList == null) {
+ mList = new ArrayList<ListItem>();
+ }
+ mList.add(new ListItem(app));
+ }
+ if (mList != null) {
+ Collections.sort(mList, sDisplayNameComparator);
+ }
+ }
+
+ public ListItem appForPosition(int position) {
+ if (mList == null) {
+ return null;
+ }
+ return mList.get(position);
+ }
+
+ public int getCount() {
+ return mList != null ? mList.size() : 0;
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view;
+ if (convertView == null) {
+ view = mInflater.inflate(
+ android.R.layout.simple_list_item_1, parent, false);
+ } else {
+ view = convertView;
+ }
+ bindView(view, mList.get(position));
+ return view;
+ }
+
+ private final void bindView(View view, ListItem info) {
+ TextView text = (TextView)view.findViewById(android.R.id.text1);
+ text.setText(info != null ? info.procInfo.processName : "(none)");
+ }
+
+ protected final Context mContext;
+ protected final LayoutInflater mInflater;
+ protected List<ListItem> mList;
+
+ }
+
+ private final Comparator sDisplayNameComparator = new Comparator() {
+ public final int compare(Object a, Object b) {
+ CharSequence sa = ((ListItem) a).procInfo.processName;
+ CharSequence sb = ((ListItem) b).procInfo.processName;
+ return collator.compare(sa, sb);
+ }
+ private final Collator collator = Collator.getInstance();
+ };
+
+ private class ListItem {
+ ActivityManager.RunningAppProcessInfo procInfo;
+ public ListItem(ActivityManager.RunningAppProcessInfo pInfo) {
+ procInfo = pInfo;
+ }
+ }
+
+ private AppListAdapter mAdapter;
+}
+
diff --git a/apps/Development/src/com/android/development/ShowActivity.java b/apps/Development/src/com/android/development/ShowActivity.java
new file mode 100644
index 0000000..1fc2816
--- /dev/null
+++ b/apps/Development/src/com/android/development/ShowActivity.java
@@ -0,0 +1,122 @@
+/* //device/apps/Settings/src/com/android/settings/Keyguard.java
+**
+** Copyright 2006, 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.android.development;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.provider.Settings;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+
+public class ShowActivity extends Activity {
+
+ private ActivityInfo mActivityInfo;
+
+ private TextView mPackage;
+ private ImageView mIconImage;
+ private TextView mClass;
+ private TextView mLabel;
+ private TextView mLaunch;
+ private TextView mProcess;
+ private TextView mTaskAffinity;
+ private TextView mPermission;
+ private TextView mMultiprocess;
+ private TextView mClearOnBackground;
+ private TextView mStateNotNeeded;
+
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.show_activity);
+
+ mPackage = (TextView)findViewById(R.id.packageView);
+ mIconImage = (ImageView)findViewById(R.id.icon);
+ mClass = (TextView)findViewById(R.id.classView);
+ mLabel = (TextView)findViewById(R.id.label);
+ mLaunch = (TextView)findViewById(R.id.launch);
+ mProcess = (TextView)findViewById(R.id.process);
+ mTaskAffinity = (TextView)findViewById(R.id.taskAffinity);
+ mPermission = (TextView)findViewById(R.id.permission);
+ mMultiprocess = (TextView)findViewById(R.id.multiprocess);
+ mClearOnBackground = (TextView)findViewById(R.id.clearOnBackground);
+ mStateNotNeeded = (TextView)findViewById(R.id.stateNotNeeded);
+
+ final PackageManager pm = getPackageManager();
+ try {
+ mActivityInfo = pm.getActivityInfo(ComponentName.unflattenFromString(
+ getIntent().getData().getSchemeSpecificPart()), 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ if (mActivityInfo != null) {
+ mPackage.setText(mActivityInfo.applicationInfo.packageName);
+ mIconImage.setImageDrawable(mActivityInfo.loadIcon(pm));
+ if (mActivityInfo.name.startsWith(
+ mActivityInfo.applicationInfo.packageName + ".")) {
+ mClass.setText(mActivityInfo.name.substring(
+ mActivityInfo.applicationInfo.packageName.length()));
+ } else {
+ mClass.setText(mActivityInfo.name);
+ }
+ CharSequence label = mActivityInfo.loadLabel(pm);
+ mLabel.setText("\"" + (label != null ? label : "") + "\"");
+ switch (mActivityInfo.launchMode) {
+ case ActivityInfo.LAUNCH_MULTIPLE:
+ mLaunch.setText(getText(R.string.launch_multiple));
+ break;
+ case ActivityInfo.LAUNCH_SINGLE_TOP:
+ mLaunch.setText(getText(R.string.launch_singleTop));
+ break;
+ case ActivityInfo.LAUNCH_SINGLE_TASK:
+ mLaunch.setText(getText(R.string.launch_singleTask));
+ break;
+ case ActivityInfo.LAUNCH_SINGLE_INSTANCE:
+ mLaunch.setText(getText(R.string.launch_singleInstance));
+ break;
+ default:
+ mLaunch.setText(getText(R.string.launch_unknown));
+ }
+ mProcess.setText(mActivityInfo.processName);
+ mTaskAffinity.setText(mActivityInfo.taskAffinity != null
+ ? mActivityInfo.taskAffinity : getText(R.string.none));
+ mPermission.setText(mActivityInfo.permission != null
+ ? mActivityInfo.permission : getText(R.string.none));
+ mMultiprocess.setText(
+ (mActivityInfo.flags&ActivityInfo.FLAG_MULTIPROCESS) != 0
+ ? getText(R.string.yes) : getText(R.string.no));
+ mClearOnBackground.setText(
+ (mActivityInfo.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0
+ ? getText(R.string.yes) : getText(R.string.no));
+ mStateNotNeeded.setText(
+ (mActivityInfo.flags&ActivityInfo.FLAG_STATE_NOT_NEEDED) != 0
+ ? getText(R.string.yes) : getText(R.string.no));
+ }
+ }
+
+ public void onResume() {
+ super.onResume();
+ }
+}
diff --git a/apps/Development/src/com/android/development/StacktraceViewer.java b/apps/Development/src/com/android/development/StacktraceViewer.java
new file mode 100644
index 0000000..96b0521
--- /dev/null
+++ b/apps/Development/src/com/android/development/StacktraceViewer.java
@@ -0,0 +1,50 @@
+/*
+** Copyright 2007, 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.android.development;
+
+
+import android.app.Activity;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.text.method.ScrollingMovementMethod;
+import android.os.Bundle;
+import android.server.data.CrashData;
+import android.server.data.ThrowableData;
+import android.server.data.StackTraceElementData;
+import android.graphics.Typeface;
+
+/**
+ * Views a single stack trace.
+ */
+public class StacktraceViewer extends Activity {
+
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.log_viewer);
+
+ TextView text = (TextView) findViewById(R.id.text);
+ text.setTextSize(10);
+ text.setHorizontallyScrolling(true);
+ text.setTypeface(Typeface.MONOSPACE);
+ text.setMovementMethod(ScrollingMovementMethod.getInstance());
+
+ String stacktrace = getIntent().getExtras().getString(
+ CrashData.class.getName());
+
+ text.setText(stacktrace);
+ }
+}
diff --git a/apps/Development/src/com/android/development/UnderdevelopedSettings.java b/apps/Development/src/com/android/development/UnderdevelopedSettings.java
new file mode 100644
index 0000000..9cf1b90
--- /dev/null
+++ b/apps/Development/src/com/android/development/UnderdevelopedSettings.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2007 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.android.development;
+
+import android.app.LauncherActivity;
+import android.content.Intent;
+
+public class UnderdevelopedSettings extends LauncherActivity {
+
+ @Override
+ protected Intent getTargetIntent() {
+ Intent targetIntent = new Intent(Intent.ACTION_MAIN, null);
+ targetIntent.addCategory(Intent.CATEGORY_DEVELOPMENT_PREFERENCE);
+ return targetIntent;
+ }
+
+}