summaryrefslogtreecommitdiffstats
path: root/samples
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-02-13 12:57:48 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-02-13 12:57:48 -0800
commit87a88c4f030dc8d60911ccb236f45d854e89877e (patch)
treea705c95368ba6fd0a8c7a357d34b03f818747e03 /samples
parente3c5766074e2d6d1dcd60c4dafabce8a0c20d2b8 (diff)
downloadandroid_development-87a88c4f030dc8d60911ccb236f45d854e89877e.tar.gz
android_development-87a88c4f030dc8d60911ccb236f45d854e89877e.tar.bz2
android_development-87a88c4f030dc8d60911ccb236f45d854e89877e.zip
auto import from //branches/cupcake/...@131421
Diffstat (limited to 'samples')
-rw-r--r--samples/ApiDemos/AndroidManifest.xml19
-rw-r--r--samples/ApiDemos/res/layout/gadget_configure.xml42
-rw-r--r--samples/ApiDemos/res/layout/gadget_provider.xml23
-rw-r--r--samples/ApiDemos/res/values/strings.xml7
-rw-r--r--samples/ApiDemos/res/xml/gadget_provider.xml27
-rw-r--r--samples/ApiDemos/src/com/example/android/apis/gadget/ExampleBroadcastReceiver.java63
-rw-r--r--samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetConfigure.java125
-rw-r--r--samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetProvider.java122
-rw-r--r--samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java20
9 files changed, 448 insertions, 0 deletions
diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml
index c106ae314..afcfbc88f 100644
--- a/samples/ApiDemos/AndroidManifest.xml
+++ b/samples/ApiDemos/AndroidManifest.xml
@@ -1653,6 +1653,25 @@
</activity>
<!-- ************************************* -->
+ <!-- GADGET PACKAGE SAMPLES -->
+ <!-- ************************************* -->
+
+ <receiver android:name=".gadget.ExampleGadgetProvider">
+ <meta-data android:name="android.gadget.provider"
+ android:resource="@xml/gadget_provider" />
+ <intent-filter>
+ <action android:name="android.gadget.action.GADGET_UPDATE" />
+ </intent-filter>
+ </receiver>
+
+ <receiver android:name=".gadget.ExampleBroadcastReceiver" android:enabled="false">
+ <intent-filter>
+ <action android:name="android.intent.ACTION_TIMEZONE_CHANGED" />
+ <action android:name="android.intent.ACTION_TIME" />
+ </intent-filter>
+ </receiver>
+
+ <!-- ************************************* -->
<!-- OTHER SAMPLES -->
<!-- ************************************* -->
diff --git a/samples/ApiDemos/res/layout/gadget_configure.xml b/samples/ApiDemos/res/layout/gadget_configure.xml
new file mode 100644
index 000000000..bc9f40dc8
--- /dev/null
+++ b/samples/ApiDemos/res/layout/gadget_configure.xml
@@ -0,0 +1,42 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ >
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/gadget_configure_instructions"
+ />
+
+ <EditText
+ android:id="@+id/gadget_prefix"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ />
+
+ <Button
+ android:id="@+id/save_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@android:string/ok"
+ />
+
+</LinearLayout>
diff --git a/samples/ApiDemos/res/layout/gadget_provider.xml b/samples/ApiDemos/res/layout/gadget_provider.xml
new file mode 100644
index 000000000..49cf42f82
--- /dev/null
+++ b/samples/ApiDemos/res/layout/gadget_provider.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/gadget_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="#ff000000"
+/>
+
diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml
index 603957f84..bd1b0a38d 100644
--- a/samples/ApiDemos/res/values/strings.xml
+++ b/samples/ApiDemos/res/values/strings.xml
@@ -813,5 +813,12 @@
<string name="textColorTertiary">textColorTertiary</string>
<string name="listSeparatorTextViewStyle">listSeparatorTextViewStyle</string>
+ <!-- ============================ -->
+ <!-- gadget examples strings -->
+ <!-- ============================ -->
+
+ <string name="gadget_configure_instructions">This text will be shown before the date in our example gadget.</string>
+ <string name="gadget_prefix_default">Oh hai</string>
+ <string name="gadget_text_format"><xliff:g id="prefix">%1$s</xliff:g>: <xliff:g id="time">%2$s</xliff:g></string>
</resources>
diff --git a/samples/ApiDemos/res/xml/gadget_provider.xml b/samples/ApiDemos/res/xml/gadget_provider.xml
new file mode 100644
index 000000000..9ad6845f4
--- /dev/null
+++ b/samples/ApiDemos/res/xml/gadget_provider.xml
@@ -0,0 +1,27 @@
+<?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.
+-->
+
+<gadget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="60dp"
+ android:minHeight="30dp"
+ android:updatePeriodMillis="86400000"
+ android:initialLayout="@layout/gadget_provider"
+ android:configure="com.example.android.apis.gadget.ExampleGadgetConfigure"
+ >
+</gadget-provider>
+
+<!-- 86400000 is the value of AlarmManager.INTERVAL_DAY - or once per day. -->
+
diff --git a/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleBroadcastReceiver.java b/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleBroadcastReceiver.java
new file mode 100644
index 000000000..eec10b2ca
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleBroadcastReceiver.java
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ */
+
+package com.example.android.apis.gadget;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.gadget.GadgetManager;
+import android.gadget.GadgetProvider;
+import android.os.SystemClock;
+import android.util.Log;
+import android.widget.RemoteViews;
+
+import java.util.ArrayList;
+
+// Need the following import to get access to the app resources, since this
+// class is in a sub-package.
+import com.example.android.apis.R;
+
+/**
+ * A BroadcastReceiver that listens for updates for the ExampleGadgetProvider. This
+ * BroadcastReceiver starts off disabled, and we only enable it when there is a gadget
+ * instance created, in order to only receive notifications when we need them.
+ */
+public class ExampleBroadcastReceiver extends BroadcastReceiver {
+
+ public void onReceive(Context context, Intent intent) {
+ Log.d("ExmampleBroadcastReceiver", "intent=" + intent);
+
+ // For our example, we'll also update all of the gadgets when the timezone
+ // changes, or the user or network sets the time.
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)
+ || action.equals(Intent.ACTION_TIME_CHANGED)) {
+ GadgetManager gm = GadgetManager.getInstance(context);
+ ArrayList<Integer> gadgetIds = new ArrayList();
+ ArrayList<String> texts = new ArrayList();
+
+ ExampleGadgetConfigure.loadAllTitlePrefs(context, gadgetIds, texts);
+
+ final int N = gadgetIds.size();
+ for (int i=0; i<N; i++) {
+ ExampleGadgetProvider.updateGadget(context, gm, gadgetIds.get(i), texts.get(i));
+ }
+ }
+ }
+
+}
diff --git a/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetConfigure.java b/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetConfigure.java
new file mode 100644
index 000000000..03e7bb42f
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetConfigure.java
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ */
+
+package com.example.android.apis.gadget;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.gadget.GadgetManager;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+
+import java.util.ArrayList;
+
+// Need the following import to get access to the app resources, since this
+// class is in a sub-package.
+import com.example.android.apis.R;
+
+/**
+ * The configuration screen for the ExampleGadgetProvider gadget sample.
+ */
+public class ExampleGadgetConfigure extends Activity {
+ static final String TAG = "ExampleGadgetConfigure";
+
+ private static final String PREFS_NAME
+ = "com.example.android.apis.gadget.ExampleGadgetProvider";
+ private static final String PREF_PREFIX_KEY = "prefix_";
+
+ int mGadgetId = GadgetManager.INVALID_GADGET_ID;
+ EditText mGadgetPrefix;
+
+ public ExampleGadgetConfigure() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ // Set the result to CANCELED. This will cause the gadget host to cancel
+ // out of the gadget placement if they press the back button.
+ setResult(RESULT_CANCELED);
+
+ // Set the view layout resource to use.
+ setContentView(R.layout.gadget_configure);
+
+ // Find the EditText
+ mGadgetPrefix = (EditText)findViewById(R.id.gadget_prefix);
+
+ // Bind the action for the save button.
+ findViewById(R.id.save_button).setOnClickListener(mOnClickListener);
+
+ // Find the gadget id from the intent.
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mGadgetId = extras.getInt(
+ GadgetManager.EXTRA_GADGET_ID, GadgetManager.INVALID_GADGET_ID);
+ }
+
+ // If they gave us an intent without the gadget id, just bail.
+ if (mGadgetId == GadgetManager.INVALID_GADGET_ID) {
+ finish();
+ }
+
+ mGadgetPrefix.setText(loadTitlePref(ExampleGadgetConfigure.this, mGadgetId));
+ }
+
+ View.OnClickListener mOnClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ // When the button is clicked, save the string in our prefs and return that they
+ // clicked OK.
+ saveTitlePref(ExampleGadgetConfigure.this, mGadgetId,
+ mGadgetPrefix.getText().toString());
+
+ setResult(RESULT_OK);
+ finish();
+ }
+ };
+
+ // Write the prefix to the SharedPreferences object for this gadget
+ static void saveTitlePref(Context context, int gadgetId, String text) {
+ SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
+ prefs.putString(PREF_PREFIX_KEY + gadgetId, text);
+ prefs.commit();
+ }
+
+ // Read the prefix from the SharedPreferences object for this gadget.
+ // If there is no preference saved, get the default from a resource
+ static String loadTitlePref(Context context, int gadgetId) {
+ SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
+ String prefix = prefs.getString(PREF_PREFIX_KEY, null);
+ if (prefix != null) {
+ return prefix;
+ } else {
+ return context.getString(R.string.gadget_prefix_default);
+ }
+ }
+
+ static void deleteTitlePref(Context context, int gadgetId) {
+ }
+
+ static void loadAllTitlePrefs(Context context, ArrayList<Integer> gadgetIds,
+ ArrayList<String> texts) {
+ }
+}
+
+
+
diff --git a/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetProvider.java b/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetProvider.java
new file mode 100644
index 000000000..eb1dab311
--- /dev/null
+++ b/samples/ApiDemos/src/com/example/android/apis/gadget/ExampleGadgetProvider.java
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ */
+
+package com.example.android.apis.gadget;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.gadget.GadgetManager;
+import android.gadget.GadgetProvider;
+import android.os.SystemClock;
+import android.util.Log;
+import android.widget.RemoteViews;
+
+import java.util.ArrayList;
+
+// Need the following import to get access to the app resources, since this
+// class is in a sub-package.
+import com.example.android.apis.R;
+
+/**
+ * A gadget provider. We have a string that we pull from a preference in order to show
+ * the configuration settings and the current time when the gadget was updated. We also
+ * register a BroadcastReceiver for time-changed and timezone-changed broadcasts, and
+ * update then too.
+ *
+ * <p>See also the following files:
+ * <ul>
+ * <li>ExampleGadgetConfigure.java</li>
+ * <li>ExampleBroadcastReceiver.java</li>
+ * <li>res/layout/gadget_configure.xml</li>
+ * <li>res/layout/gadget_provider.xml</li>
+ * <li>res/xml/gadget_provider.xml</li>
+ * </ul>
+ */
+public class ExampleGadgetProvider extends GadgetProvider {
+ // log tag
+ private static final String TAG = "ExampleGadgetProvider";
+
+ public void onUpdate(Context context, GadgetManager gadgetManager, int[] gadgetIds) {
+ Log.d(TAG, "onUpdate");
+ // For each gadget that needs an update, get the text that we should display:
+ // - Create a RemoteViews object for it
+ // - Set the text in the RemoteViews object
+ // - Tell the GadgetManager to show that views object for the gadget.
+ final int N = gadgetIds.length;
+ for (int i=0; i<N; i++) {
+ int gadgetId = gadgetIds[i];
+ String titlePrefix = ExampleGadgetConfigure.loadTitlePref(context, gadgetId);
+ updateGadget(context, gadgetManager, gadgetId, titlePrefix);
+ }
+ }
+
+ public void onDeleted(Context context, int[] gadgetIds) {
+ Log.d(TAG, "onDeleted");
+ // When the user deletes the gadget, delete the preference associated with it.
+ final int N = gadgetIds.length;
+ for (int i=0; i<N; i++) {
+ ExampleGadgetConfigure.deleteTitlePref(context, gadgetIds[i]);
+ }
+ }
+
+ public void onEnabled(Context context) {
+ Log.d(TAG, "onEnabled");
+ // When the first gadget is created, register for the TIMEZONE_CHANGED and TIME_CHANGED
+ // broadcasts. We don't want to be listening for these if nobody has our gadget active.
+ // This setting is sticky across reboots, but that doesn't matter, because this will
+ // be called after boot if there is a gadget instance for this provider.
+ PackageManager pm = context.getPackageManager();
+ pm.setComponentEnabledSetting(
+ new ComponentName("com.example.android.apis", ".gadget.ExampleBroadcastReceiver"),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+ public void onDisabled(Context context) {
+ // When the first gadget is created, stop listening for the TIMEZONE_CHANGED and
+ // TIME_CHANGED broadcasts.
+ Log.d(TAG, "onDisabled");
+ Class clazz = ExampleBroadcastReceiver.class;
+ PackageManager pm = context.getPackageManager();
+ pm.setComponentEnabledSetting(
+ new ComponentName("com.example.android.apis", ".gadget.ExampleBroadcastReceiver"),
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+ static void updateGadget(Context context, GadgetManager gadgetManager,
+ int gadgetId, String titlePrefix) {
+ Log.d(TAG, "updateGadget gadgetId=" + gadgetId + " titlePrefix=" + titlePrefix);
+ // Getting the string this way allows the string to be localized. The format
+ // string is filled in using java.util.Formatter-style format strings.
+ CharSequence text = context.getString(R.string.gadget_text_format,
+ ExampleGadgetConfigure.loadTitlePref(context, gadgetId),
+ "0x" + Long.toHexString(SystemClock.elapsedRealtime()));
+
+ // Construct the RemoteViews object. It takes the package name (in our case, it's our
+ // package, but it needs this because on the other side it's the gadget host inflating
+ // the layout from our package).
+ RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gadget_provider);
+ views.setTextViewText(R.id.gadget_text, text);
+
+ // Tell the gadget manager
+ gadgetManager.updateGadget(gadgetId, views);
+ }
+}
+
+
diff --git a/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java b/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java
index cc1174aa6..4df485318 100644
--- a/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java
+++ b/samples/SoftKeyboard/src/com/example/android/softkeyboard/SoftKeyboard.java
@@ -358,6 +358,26 @@ public class SoftKeyboard extends InputMethodService
// text being entered with a hard keyboard, we need to process
// it and do the appropriate action.
if (PROCESS_HARD_KEYS) {
+ if (keyCode == KeyEvent.KEYCODE_SPACE
+ && (event.getMetaState()&KeyEvent.META_ALT_ON) != 0) {
+ // A silly example: in our input method, Alt+Space
+ // is a shortcut for 'android' in lower case.
+ InputConnection ic = getCurrentInputConnection();
+ if (ic != null) {
+ // First, tell the editor that it is no longer in the
+ // shift state, since we are consuming this.
+ ic.clearMetaKeyStates(KeyEvent.META_ALT_ON);
+ keyDownUp(KeyEvent.KEYCODE_A);
+ keyDownUp(KeyEvent.KEYCODE_N);
+ keyDownUp(KeyEvent.KEYCODE_D);
+ keyDownUp(KeyEvent.KEYCODE_R);
+ keyDownUp(KeyEvent.KEYCODE_O);
+ keyDownUp(KeyEvent.KEYCODE_I);
+ keyDownUp(KeyEvent.KEYCODE_D);
+ // And we consume this event.
+ return true;
+ }
+ }
if (mPredictionOn && translateKeyDown(keyCode, event)) {
return true;
}