diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-13 12:57:48 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-13 12:57:48 -0800 |
| commit | 87a88c4f030dc8d60911ccb236f45d854e89877e (patch) | |
| tree | a705c95368ba6fd0a8c7a357d34b03f818747e03 /samples | |
| parent | e3c5766074e2d6d1dcd60c4dafabce8a0c20d2b8 (diff) | |
| download | android_development-87a88c4f030dc8d60911ccb236f45d854e89877e.tar.gz android_development-87a88c4f030dc8d60911ccb236f45d854e89877e.tar.bz2 android_development-87a88c4f030dc8d60911ccb236f45d854e89877e.zip | |
auto import from //branches/cupcake/...@131421
Diffstat (limited to 'samples')
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; } |
