From 30073fb13b813af0be02239da28f6b711f094358 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Fri, 21 Oct 2011 17:23:10 -0700 Subject: Adding a code sample for how to write a custom action provider. NOTE: This change does *not* affect the system image rather only the SDK. bug:5499856 Change-Id: I589ed412b72e94b21dbe1f069006c7c527a06c71 --- samples/ApiDemos/AndroidManifest.xml | 13 ++- samples/ApiDemos/_index.html | 7 +- .../res/drawable-hdpi/ic_launcher_settings.png | Bin 0 -> 7230 bytes .../res/drawable-mdpi/ic_launcher_settings.png | Bin 0 -> 4122 bytes .../res/drawable-xhdpi/ic_launcher_settings.png | Bin 0 -> 11183 bytes .../layout/action_bar_settings_action_provider.xml | 34 ++++++ .../res/menu/action_bar_action_provider.xml | 28 ----- .../menu/action_bar_settings_action_provider.xml | 28 +++++ .../res/menu/action_bar_share_action_provider.xml | 28 +++++ samples/ApiDemos/res/values/strings.xml | 5 +- .../apis/app/ActionBarActionProviderActivity.java | 125 --------------------- .../ActionBarSettingsActionProviderActivity.java | 121 ++++++++++++++++++++ .../app/ActionBarShareActionProviderActivity.java | 125 +++++++++++++++++++++ .../src/com/example/android/apis/app/_index.html | 10 +- 14 files changed, 362 insertions(+), 162 deletions(-) create mode 100644 samples/ApiDemos/res/drawable-hdpi/ic_launcher_settings.png create mode 100644 samples/ApiDemos/res/drawable-mdpi/ic_launcher_settings.png create mode 100644 samples/ApiDemos/res/drawable-xhdpi/ic_launcher_settings.png create mode 100644 samples/ApiDemos/res/layout/action_bar_settings_action_provider.xml delete mode 100644 samples/ApiDemos/res/menu/action_bar_action_provider.xml create mode 100644 samples/ApiDemos/res/menu/action_bar_settings_action_provider.xml create mode 100644 samples/ApiDemos/res/menu/action_bar_share_action_provider.xml delete mode 100644 samples/ApiDemos/src/com/example/android/apis/app/ActionBarActionProviderActivity.java create mode 100644 samples/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java create mode 100644 samples/ApiDemos/src/com/example/android/apis/app/ActionBarShareActionProviderActivity.java (limited to 'samples') diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml index 4a4a7c3eb..2449e062e 100644 --- a/samples/ApiDemos/AndroidManifest.xml +++ b/samples/ApiDemos/AndroidManifest.xml @@ -816,8 +816,17 @@ - + + + + + + + diff --git a/samples/ApiDemos/_index.html b/samples/ApiDemos/_index.html index 002ca1585..9466c95b5 100644 --- a/samples/ApiDemos/_index.html +++ b/samples/ApiDemos/_index.html @@ -20,9 +20,12 @@ that illustrate the use of various Android APIs. It includes samples of:

Update: The following are some of the new demos for Android 4.0:

  • SwitchPreference
  • +href="src/com/example/android/apis/preference/PreferencesFromCode.html">Switch Preference
  • ShareActionProvider +href="src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.html">Settings Action Provider +
  • +
  • Share Action Provider
  • Collapsible action view
  • diff --git a/samples/ApiDemos/res/drawable-hdpi/ic_launcher_settings.png b/samples/ApiDemos/res/drawable-hdpi/ic_launcher_settings.png new file mode 100644 index 000000000..c02bd424f Binary files /dev/null and b/samples/ApiDemos/res/drawable-hdpi/ic_launcher_settings.png differ diff --git a/samples/ApiDemos/res/drawable-mdpi/ic_launcher_settings.png b/samples/ApiDemos/res/drawable-mdpi/ic_launcher_settings.png new file mode 100644 index 000000000..05cdd9aa9 Binary files /dev/null and b/samples/ApiDemos/res/drawable-mdpi/ic_launcher_settings.png differ diff --git a/samples/ApiDemos/res/drawable-xhdpi/ic_launcher_settings.png b/samples/ApiDemos/res/drawable-xhdpi/ic_launcher_settings.png new file mode 100644 index 000000000..2b2907b60 Binary files /dev/null and b/samples/ApiDemos/res/drawable-xhdpi/ic_launcher_settings.png differ diff --git a/samples/ApiDemos/res/layout/action_bar_settings_action_provider.xml b/samples/ApiDemos/res/layout/action_bar_settings_action_provider.xml new file mode 100644 index 000000000..dd9807b74 --- /dev/null +++ b/samples/ApiDemos/res/layout/action_bar_settings_action_provider.xml @@ -0,0 +1,34 @@ + + + + + + + + diff --git a/samples/ApiDemos/res/menu/action_bar_action_provider.xml b/samples/ApiDemos/res/menu/action_bar_action_provider.xml deleted file mode 100644 index 7633f9ff5..000000000 --- a/samples/ApiDemos/res/menu/action_bar_action_provider.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - diff --git a/samples/ApiDemos/res/menu/action_bar_settings_action_provider.xml b/samples/ApiDemos/res/menu/action_bar_settings_action_provider.xml new file mode 100644 index 000000000..b72a7d136 --- /dev/null +++ b/samples/ApiDemos/res/menu/action_bar_settings_action_provider.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/samples/ApiDemos/res/menu/action_bar_share_action_provider.xml b/samples/ApiDemos/res/menu/action_bar_share_action_provider.xml new file mode 100644 index 000000000..7633f9ff5 --- /dev/null +++ b/samples/ApiDemos/res/menu/action_bar_share_action_provider.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml index 45d47554f..5a7183c6d 100644 --- a/samples/ApiDemos/res/values/strings.xml +++ b/samples/ApiDemos/res/values/strings.xml @@ -731,7 +731,9 @@ App/Action Bar/Action Bar Mechanics App/Action Bar/Action Bar Usage App/Action Bar/Action Bar Tabs - App/Action Bar/Action Provider + App/Action Bar/Action Provider/Settings Action Provider + App/Action Bar/Action Provider/Share Action Provider + Handling in onOptionsItemSelected avoided Search Add @@ -741,6 +743,7 @@ Alphabetically By size Share with... + Settings App/Action Bar/Display Options DISPLAY_HOME_AS_UP diff --git a/samples/ApiDemos/src/com/example/android/apis/app/ActionBarActionProviderActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarActionProviderActivity.java deleted file mode 100644 index 2d6bfd7f4..000000000 --- a/samples/ApiDemos/src/com/example/android/apis/app/ActionBarActionProviderActivity.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2011 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.app; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.ShareActionProvider; - -import com.example.android.apis.R; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * This activity demonstrates how to use an {@link android.view.ActionProvider} - * for adding functionality to the Action Bar. In particular this demo is adding - * a menu item with ShareActionProvider as its action provider. The - * ShareActionProvider is responsible for managing the UI for sharing actions. - */ -public class ActionBarActionProviderActivity extends Activity { - - private static final String SHARED_FILE_NAME = "shared.png"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - copyPrivateRawResuorceToPubliclyAccessibleFile(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate your menu. - getMenuInflater().inflate(R.menu.action_bar_action_provider, menu); - - // Set file with share history to the provider and set the share intent. - MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar); - ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider(); - actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME); - // Note that you can set/change the intent any time, - // say when the user has selected an image. - actionProvider.setShareIntent(createShareIntent()); - - // Set file with share history to the provider and set the share intent. - MenuItem overflowItem = menu.findItem(R.id.menu_item_share_action_provider_overflow); - ShareActionProvider overflowProvider = - (ShareActionProvider) overflowItem.getActionProvider(); - overflowProvider.setShareHistoryFileName( - ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME); - // Note that you can set/change the intent any time, - // say when the user has selected an image. - overflowProvider.setShareIntent(createShareIntent()); - - return true; - } - - /** - * Creates a sharing {@link Intent}. - * - * @return The sharing intent. - */ - private Intent createShareIntent() { - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("image/*"); - Uri uri = Uri.fromFile(getFileStreamPath("shared.png")); - shareIntent.putExtra(Intent.EXTRA_STREAM, uri); - return shareIntent; - } - - /** - * Copies a private raw resource content to a publicly readable - * file such that the latter can be shared with other applications. - */ - private void copyPrivateRawResuorceToPubliclyAccessibleFile() { - InputStream inputStream = null; - FileOutputStream outputStream = null; - try { - inputStream = getResources().openRawResource(R.raw.robot); - outputStream = openFileOutput(SHARED_FILE_NAME, - Context.MODE_WORLD_READABLE | Context.MODE_APPEND); - byte[] buffer = new byte[1024]; - int length = 0; - try { - while ((length = inputStream.read(buffer)) > 0){ - outputStream.write(buffer, 0, length); - } - } catch (IOException ioe) { - /* ignore */ - } - } catch (FileNotFoundException fnfe) { - /* ignore */ - } finally { - try { - inputStream.close(); - } catch (IOException ioe) { - /* ignore */ - } - try { - outputStream.close(); - } catch (IOException ioe) { - /* ignore */ - } - } - } -} diff --git a/samples/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java new file mode 100644 index 000000000..2bf7c3785 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarSettingsActionProviderActivity.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2011 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.app; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.provider.Settings; +import android.view.ActionProvider; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageButton; +import android.widget.Toast; + +import com.example.android.apis.R; + +/** + * This activity demonstrates how to implement an {@link android.view.ActionProvider} + * for adding functionality to the Action Bar. In particular this demo creates an + * ActionProvider for launching the system settings and adds a menu item with that + * provider. + */ +public class ActionBarSettingsActionProviderActivity extends Activity { + + /** + * {@inheritDoc} + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + getMenuInflater().inflate(R.menu.action_bar_settings_action_provider, menu); + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // If this callback does not handle the item click, onPerformDefaultAction + // of the ActionProvider is invoked. Hence, the provider encapsulates the + // complete functionality of the menu item. + Toast.makeText(this, R.string.action_bar_settings_action_provider_no_handling, + Toast.LENGTH_SHORT).show(); + return false; + } + + public static class SettingsActionProvider extends ActionProvider { + + /** An intent for launching the system settings. */ + private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS); + + /** Context for accessing resources. */ + private final Context mContext; + + /** + * Creates a new instance. + * + * @param context Context for accessing resources. + */ + public SettingsActionProvider(Context context) { + super(context); + mContext = context; + } + + /** + * {@inheritDoc} + */ + @Override + public View onCreateActionView() { + // Inflate the action view to be shown on the action bar. + LayoutInflater layoutInflater = LayoutInflater.from(mContext); + View view = layoutInflater.inflate(R.layout.action_bar_settings_action_provider, null); + ImageButton button = (ImageButton) view.findViewById(R.id.button); + // Attach a click listener for launching the system settings. + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mContext.startActivity(sSettingsIntent); + } + }); + return view; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean onPerformDefaultAction() { + // This is called if the host menu item placed in the overflow menu of the + // action bar is clicked and the host activity did not handle the click. + mContext.startActivity(sSettingsIntent); + return true; + } + } +} diff --git a/samples/ApiDemos/src/com/example/android/apis/app/ActionBarShareActionProviderActivity.java b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarShareActionProviderActivity.java new file mode 100644 index 000000000..4f37b8d81 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/app/ActionBarShareActionProviderActivity.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2011 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.app; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.ShareActionProvider; + +import com.example.android.apis.R; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * This activity demonstrates how to use an {@link android.view.ActionProvider} + * for adding functionality to the Action Bar. In particular this demo is adding + * a menu item with ShareActionProvider as its action provider. The + * ShareActionProvider is responsible for managing the UI for sharing actions. + */ +public class ActionBarShareActionProviderActivity extends Activity { + + private static final String SHARED_FILE_NAME = "shared.png"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + copyPrivateRawResuorceToPubliclyAccessibleFile(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate your menu. + getMenuInflater().inflate(R.menu.action_bar_share_action_provider, menu); + + // Set file with share history to the provider and set the share intent. + MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar); + ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider(); + actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME); + // Note that you can set/change the intent any time, + // say when the user has selected an image. + actionProvider.setShareIntent(createShareIntent()); + + // Set file with share history to the provider and set the share intent. + MenuItem overflowItem = menu.findItem(R.id.menu_item_share_action_provider_overflow); + ShareActionProvider overflowProvider = + (ShareActionProvider) overflowItem.getActionProvider(); + overflowProvider.setShareHistoryFileName( + ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME); + // Note that you can set/change the intent any time, + // say when the user has selected an image. + overflowProvider.setShareIntent(createShareIntent()); + + return true; + } + + /** + * Creates a sharing {@link Intent}. + * + * @return The sharing intent. + */ + private Intent createShareIntent() { + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("image/*"); + Uri uri = Uri.fromFile(getFileStreamPath("shared.png")); + shareIntent.putExtra(Intent.EXTRA_STREAM, uri); + return shareIntent; + } + + /** + * Copies a private raw resource content to a publicly readable + * file such that the latter can be shared with other applications. + */ + private void copyPrivateRawResuorceToPubliclyAccessibleFile() { + InputStream inputStream = null; + FileOutputStream outputStream = null; + try { + inputStream = getResources().openRawResource(R.raw.robot); + outputStream = openFileOutput(SHARED_FILE_NAME, + Context.MODE_WORLD_READABLE | Context.MODE_APPEND); + byte[] buffer = new byte[1024]; + int length = 0; + try { + while ((length = inputStream.read(buffer)) > 0){ + outputStream.write(buffer, 0, length); + } + } catch (IOException ioe) { + /* ignore */ + } + } catch (FileNotFoundException fnfe) { + /* ignore */ + } finally { + try { + inputStream.close(); + } catch (IOException ioe) { + /* ignore */ + } + try { + outputStream.close(); + } catch (IOException ioe) { + /* ignore */ + } + } + } +} diff --git a/samples/ApiDemos/src/com/example/android/apis/app/_index.html b/samples/ApiDemos/src/com/example/android/apis/app/_index.html index 4333d575e..9400bc9f5 100644 --- a/samples/ApiDemos/src/com/example/android/apis/app/_index.html +++ b/samples/ApiDemos/src/com/example/android/apis/app/_index.html @@ -160,10 +160,12 @@ complete example of how to switch between fragments. default Honeycomb theme includes the Action Bar by default and a menu resource is used to populate the menu data itself. If you'd like to see how these things work under the hood, see Mechanics. -
    ActionProvider
    -
    Shows how to use an ActionProvider to supply a menu item with a specialized action view and - handle standard menu item clicks in one place. Demonstrated using the streamlined sharing UI - added in ICS.
    +
    Settings Action Provider
    +
    Shows how to implement an ActionProvider for launching the system settings that supplies a + menu item with a specialized action view and handles standard menu item clicks in one place.
    +
    Share Action Provider
    +
    Shows how to use a ShareActionProvider to embed sharing functionality in your application + via the streamlined sharing UI added in ICS.
    Display Options
    Shows how various Action Bar display option flags can be combined and their effects.
    -- cgit v1.2.3