am 8654b6c6: am 3ff1591c: am 28b127ec: New DevBytes animation demos
* commit '8654b6c6ac430c285d9ad5bc7999a1c5390efa61':
New DevBytes animation demos
diff --git a/samples/Support4Demos/AndroidManifest.xml b/samples/Support4Demos/AndroidManifest.xml
index b747876..3a0d545 100644
--- a/samples/Support4Demos/AndroidManifest.xml
+++ b/samples/Support4Demos/AndroidManifest.xml
@@ -24,7 +24,7 @@
<uses-permission android:name="android.permission.READ_CONTACTS" />
- <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="13" />
+ <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="17" />
<!-- The smallest screen this app works on is a phone. The app will
scale its UI to larger screens but doesn't make good use of them
@@ -276,8 +276,46 @@
</intent-filter>
</activity>
+ <activity android:name=".widget.DrawerLayoutActivity"
+ android:label="@string/drawer_layout_support">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".widget.SlidingPaneLayoutActivity"
+ android:label="@string/sliding_pane_layout_support">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+ </intent-filter>
+ </activity>
+
<provider android:authorities="com.example.supportv4.content.sharingsupportprovider"
android:name=".content.SharingSupportProvider" />
+ <!-- FileProvider Example -->
+
+ <activity android:name=".content.FileProviderExample"
+ android:label="@string/file_provider_example">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+ </intent-filter>
+ </activity>
+
+<!-- BEGIN_INCLUDE(file_provider_declaration) -->
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="com.example.android.supportv4.my_files"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/my_paths" />
+ </provider>
+<!-- END_INCLUDE(file_provider_declaration) -->
+
</application>
</manifest>
diff --git a/samples/Support4Demos/res/drawable-hdpi/drawer_shadow.9.png b/samples/Support4Demos/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..224cc4f
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_drawer.png b/samples/Support4Demos/res/drawable-hdpi/ic_drawer.png
new file mode 100644
index 0000000..ff7b1de
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_drawer.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/drawer_shadow.9.png b/samples/Support4Demos/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..3797f99
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/ic_drawer.png b/samples/Support4Demos/res/drawable-mdpi/ic_drawer.png
new file mode 100644
index 0000000..fb681ba
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/ic_drawer.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/drawer_shadow.9.png b/samples/Support4Demos/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..fa3d853
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_drawer.png b/samples/Support4Demos/res/drawable-xhdpi/ic_drawer.png
new file mode 100644
index 0000000..b9bc3d7
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_drawer.png
Binary files differ
diff --git a/samples/Support4Demos/res/layout/drawer_layout.xml b/samples/Support4Demos/res/layout/drawer_layout.xml
new file mode 100644
index 0000000..2ab0b1a
--- /dev/null
+++ b/samples/Support4Demos/res/layout/drawer_layout.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<!--
+ A DrawerLayout is indended to be used as the top-level content view
+ using match_parent for both width and height to consume the full space available.
+-->
+<android.support.v4.widget.DrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- As the main content view, the view below consumes the entire
+ space available using match_parent in both dimensions. -->
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:scrollbarStyle="outsideOverlay">
+ <TextView android:id="@+id/content_text"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/drawer_layout_summary"
+ android:textAppearance="?android:attr/textAppearanceMedium"/>
+ </ScrollView>
+ <!-- android:layout_gravity="left" tells DrawerLayout to treat
+ this as a sliding drawer on the left side. The drawer is
+ given a fixed width in dp and extends the full height of
+ the container. A solid background is used for contrast
+ with the content view. -->
+ <ListView android:id="@+id/left_drawer"
+ android:layout_width="300dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="left"
+ android:background="#ff333333"/>
+</android.support.v4.widget.DrawerLayout>
+
diff --git a/samples/Support4Demos/res/layout/file_provider_example.xml b/samples/Support4Demos/res/layout/file_provider_example.xml
new file mode 100644
index 0000000..2e53c3b
--- /dev/null
+++ b/samples/Support4Demos/res/layout/file_provider_example.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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:padding="16dp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:text="@string/share_file"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:onClick="onShareFileClick" />
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/sliding_pane_layout.xml b/samples/Support4Demos/res/layout/sliding_pane_layout.xml
new file mode 100644
index 0000000..ea0ff96
--- /dev/null
+++ b/samples/Support4Demos/res/layout/sliding_pane_layout.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<!--
+ A SlidingPaneLayout is indended to be used as the top-level content view
+ using match_parent for both width and height to consume the full space available.
+-->
+<android.support.v4.widget.SlidingPaneLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/sliding_pane_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <!-- The first child view becomes the left pane. When the combined
+ desired width (expressed using android:layout_width) would
+ not fit on-screen at once, the right pane is permitted to
+ overlap the left. -->
+ <ListView android:id="@+id/left_pane"
+ android:layout_width="280dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="left"/>
+ <!-- The second child becomes the right (content) pane. In this
+ example, android:layout_weight is used to express that this
+ pane should grow to consume leftover available space when the
+ window is wide enough. This allows the content pane to
+ responsively grow in width on larger screens while still
+ requiring at least the minimum width expressed by
+ android:layout_width. -->
+ <ScrollView
+ android:layout_width="300dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:scrollbarStyle="outsideOverlay"
+ android:background="#ff333333">
+ <TextView android:id="@+id/content_text"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/sliding_pane_layout_summary"
+ android:textAppearance="?android:attr/textAppearanceMedium"/>
+ </ScrollView>
+</android.support.v4.widget.SlidingPaneLayout>
+
diff --git a/samples/Support4Demos/res/values/strings.xml b/samples/Support4Demos/res/values/strings.xml
index 35cbb75..3cb4c2c 100644
--- a/samples/Support4Demos/res/values/strings.xml
+++ b/samples/Support4Demos/res/values/strings.xml
@@ -134,4 +134,16 @@
<string name="sharing_support_title">ShareCompat Demo</string>
<string name="sharing_receiver_title">ShareCompat Receiver</string>
+ <string name="file_provider_example">FileProvider example</string>
+ <string name="drawer_layout_support">Widget/Drawer layout</string>
+
+ <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The drawer may be pulled out from the left edge with an edge swipe. If this demo is running on Ice Cream Sandwich or newer you may tap the icon at the left side of the action bar to open the drawer as well.</string>
+
+ <string name="drawer_open">Open navigation drawer</string>
+ <string name="drawer_close">Close navigation drawer</string>
+
+ <string name="sliding_pane_layout_support">Widget/Sliding pane layout</string>
+
+ <string name="sliding_pane_layout_summary">This activity illustrates the use of sliding panes. The content pane may be slid to one side on narrow devices to reveal the left pane used to select content. Sliding panes can be used to fit a UI intended for wider screens in a smaller space. Tapping the Action Bar\'s Up button at the left side of the bar will navigate up in the hierarchy, represented by the left pane. If you rotate the device to landscape mode, on most devices you will see that both panes fit together side by side with no sliding necessary.</string>
+
</resources>
diff --git a/samples/Support4Demos/res/xml/my_paths.xml b/samples/Support4Demos/res/xml/my_paths.xml
new file mode 100644
index 0000000..f7223d3
--- /dev/null
+++ b/samples/Support4Demos/res/xml/my_paths.xml
@@ -0,0 +1,14 @@
+<!-- BEGIN_INCLUDE(file_provider_paths_declaration) -->
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Offer access to files under Context.getFilesDir() + "thumbs/"
+ through alias "my_thumbs" -->
+ <files-path name="my_thumbs" path="thumbs/" />
+
+ <!-- Offer access to files under Environment.getExternalStorageDirectory()
+ through alias "my_external" -->
+ <external-path name="my_external" />
+
+ <!-- Offer access to files under "/proc" through alias "my_proc" -->
+ <root-path name="my_proc" path="proc/" />
+</paths>
+<!-- END_INCLUDE(file_provider_paths_declaration) -->
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java b/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java
new file mode 100644
index 0000000..926c632
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java
@@ -0,0 +1,81 @@
+/*
+ * 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.supportv4.content;
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.content.FileProvider;
+import android.view.View;
+
+import com.example.android.supportv4.R;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Sample that shows how private files can be easily shared.
+ */
+public class FileProviderExample extends Activity {
+ private static final String AUTHORITY = "com.example.android.supportv4.my_files";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.file_provider_example);
+ }
+
+ public void onShareFileClick(View view) {
+ // Save a thumbnail to file
+ final File thumbsDir = new File(getFilesDir(), "thumbs");
+ thumbsDir.mkdirs();
+ final File file = new File(thumbsDir, "private.png");
+ saveThumbnail(view, file);
+
+ // Now share that private file using FileProvider
+ final Uri uri = FileProvider.getUriForFile(this, AUTHORITY, file);
+ final Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType("image/png");
+ intent.putExtra(Intent.EXTRA_STREAM, uri);
+ startActivity(intent);
+ }
+
+ /**
+ * Save thumbnail of given {@link View} to {@link File}.
+ */
+ private void saveThumbnail(View view, File file) {
+ final Bitmap bitmap = Bitmap.createBitmap(
+ view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(bitmap);
+ view.draw(canvas);
+
+ try {
+ final OutputStream os = new FileOutputStream(file);
+ try {
+ bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
+ } finally {
+ os.close();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java
new file mode 100644
index 0000000..ce311cc
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/DrawerLayoutActivity.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2013 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.supportv4.widget;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.view.Gravity;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.example.android.supportv4.R;
+import com.example.android.supportv4.Shakespeare;
+
+/**
+ * This example illustrates a common usage of the DrawerLayout widget
+ * in the Android support library.
+ *
+ * <p>A DrawerLayout should be positioned at the top of your view hierarchy, placing it
+ * below the action bar but above your content views. The primary content should match_parent
+ * in both dimensions. Each drawer should define a reasonable width and match_parent for height.
+ * Drawer views should be positioned after the content view in your layout to preserve proper
+ * ordering.</p>
+ *
+ * <p>When a navigation (left) drawer is present, the host activity should detect presses of
+ * the action bar's Up affordance as a signal to open and close the navigation drawer.
+ * Items within the drawer should fall into one of two categories.</p>
+ *
+ * <ul>
+ * <li><strong>View switches</strong>. A view switch follows the same basic policies as
+ * list or tab navigation in that a view switch does not create navigation history.
+ * This pattern should only be used at the root activity of a task, leaving some form
+ * of Up navigation active for activities further down the navigation hierarchy.</li>
+ * <li><strong>Selective Up</strong>. The drawer allows the user to choose an alternate
+ * parent for Up navigation. This allows a user to jump across an app's navigation
+ * hierarchy at will. The application should treat this as it treats Up navigation from
+ * a different task, replacing the current task stack using TaskStackBuilder or similar.
+ * This is the only form of navigation drawer that should be used outside of the root
+ * activity of a task.</li>
+ * </ul>
+ *
+ * <p>Right side drawers should be used for actions, not navigation. This follows the pattern
+ * established by the Action Bar that navigation should be to the left and actions to the right.
+ * An action should be an operation performed on the current contents of the window,
+ * for example enabling or disabling a data overlay on top of the current content.</p>
+ */
+public class DrawerLayoutActivity extends Activity {
+ private DrawerLayout mDrawerLayout;
+ private ListView mDrawer;
+ private TextView mContent;
+
+ private ActionBarHelper mActionBar;
+
+ private ActionBarDrawerToggle mDrawerToggle;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.drawer_layout);
+
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawer = (ListView) findViewById(R.id.left_drawer);
+ mContent = (TextView) findViewById(R.id.content_text);
+
+ mDrawerLayout.setDrawerListener(new DemoDrawerListener());
+ mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+
+ mDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
+ Shakespeare.TITLES));
+ mDrawer.setOnItemClickListener(new DrawerItemClickListener());
+
+ mActionBar = createActionBarHelper();
+ mActionBar.init();
+
+ // ActionBarDrawerToggle provides convenient helpers for tying together the
+ // prescribed interactions between a top-level sliding drawer and the action bar.
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+ R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ // Sync the toggle state after onRestoreInstanceState has occurred.
+ mDrawerToggle.syncState();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ /*
+ * The action bar home/up action should open or close the drawer.
+ * mDrawerToggle will take care of this.
+ */
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ /**
+ * This list item click listener implements very simple view switching by changing
+ * the primary content text. The drawer is closed when a selection is made.
+ */
+ private class DrawerItemClickListener implements ListView.OnItemClickListener {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ mContent.setText(Shakespeare.DIALOGUE[position]);
+ mActionBar.setTitle(Shakespeare.TITLES[position]);
+ mDrawerLayout.closeDrawer(mDrawer);
+ }
+ }
+
+ /**
+ * A drawer listener can be used to respond to drawer events such as becoming
+ * fully opened or closed. You should always prefer to perform expensive operations
+ * such as drastic relayout when no animation is currently in progress, either before
+ * or after the drawer animates.
+ *
+ * When using ActionBarDrawerToggle, all DrawerLayout listener methods should be forwarded
+ * if the ActionBarDrawerToggle is not used as the DrawerLayout listener directly.
+ */
+ private class DemoDrawerListener implements DrawerLayout.DrawerListener {
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ mDrawerToggle.onDrawerOpened(drawerView);
+ mActionBar.onDrawerOpened();
+ }
+
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ mDrawerToggle.onDrawerClosed(drawerView);
+ mActionBar.onDrawerClosed();
+ }
+
+ @Override
+ public void onDrawerSlide(View drawerView, float slideOffset) {
+ mDrawerToggle.onDrawerSlide(drawerView, slideOffset);
+ }
+
+ @Override
+ public void onDrawerStateChanged(int newState) {
+ mDrawerToggle.onDrawerStateChanged(newState);
+ }
+ }
+
+ /**
+ * Create a compatible helper that will manipulate the action bar if available.
+ */
+ private ActionBarHelper createActionBarHelper() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return new ActionBarHelperICS();
+ } else {
+ return new ActionBarHelper();
+ }
+ }
+
+ /**
+ * Stub action bar helper; this does nothing.
+ */
+ private class ActionBarHelper {
+ public void init() {}
+ public void onDrawerClosed() {}
+ public void onDrawerOpened() {}
+ public void setTitle(CharSequence title) {}
+ }
+
+ /**
+ * Action bar helper for use on ICS and newer devices.
+ */
+ private class ActionBarHelperICS extends ActionBarHelper {
+ private final ActionBar mActionBar;
+ private CharSequence mDrawerTitle;
+ private CharSequence mTitle;
+
+ ActionBarHelperICS() {
+ mActionBar = getActionBar();
+ }
+
+ @Override
+ public void init() {
+ mActionBar.setDisplayHomeAsUpEnabled(true);
+ mActionBar.setHomeButtonEnabled(true);
+ mTitle = mDrawerTitle = getTitle();
+ }
+
+ /**
+ * When the drawer is closed we restore the action bar state reflecting
+ * the specific contents in view.
+ */
+ @Override
+ public void onDrawerClosed() {
+ super.onDrawerClosed();
+ mActionBar.setTitle(mTitle);
+ }
+
+ /**
+ * When the drawer is open we set the action bar to a generic title.
+ * The action bar should only contain data relevant at the top level of
+ * the nav hierarchy represented by the drawer, as the rest of your content
+ * will be dimmed down and non-interactive.
+ */
+ @Override
+ public void onDrawerOpened() {
+ super.onDrawerOpened();
+ mActionBar.setTitle(mDrawerTitle);
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ mTitle = title;
+ }
+ }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
new file mode 100644
index 0000000..f26e038
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2013 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.supportv4.widget;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.widget.SlidingPaneLayout;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.example.android.supportv4.Shakespeare;
+import com.example.android.supportv4.R;
+
+/**
+ * This example illustrates a common usage of SlidingPaneLayout in the Android support library.
+ *
+ * <p>A SlidingPaneLayout should be positioned at the top of your view hierarchy, placing it
+ * below the action bar but above your content views. It is ideal as a two-pane layout
+ * for larger screens, used in place of a horizontal LinearLayout.</p>
+ *
+ * <p>What separates SlidingPaneLayout from LinearLayout in this usage is that SlidingPaneLayout
+ * allows these wide, two-pane layouts to overlap when horizontal space is at a premium. The user
+ * can then access both panes by physically sliding the content pane into view or out of the way
+ * or implicitly by moving focus between the two panes. This can greatly simplify development
+ * of Android apps that support multiple form factors and screen sizes.</p>
+ *
+ * <p>When it comes to your navigation hierarchy, the left pane of a SlidingPaneLayout is always
+ * considered to be one level up from the right content pane. As such, your Action Bar's
+ * Up navigation should be enabled if the right pane is obscuring the left pane, and invoking it
+ * should open the panes, revealing the left pane for normal interaction. From this open state
+ * where the left pane is in primary focus, the Action Bar's Up affordance should act as if
+ * both panes were fully visible in the activity window and navigate to the activity one level up
+ * in the app's logical hierarchy. If the activity is the root of the application's task, the up
+ * affordance should be disabled when the sliding pane is open and showing the left pane.
+ * This code example illustrates this root activity case.</p>
+ *
+ * <p>Note that SlidingPaneLayout differs in usage from DrawerLayout. While DrawerLayout offers
+ * sliding utility drawers for extended navigation options and actions, the panes of a
+ * SlidingPaneLayout are firmly part of the content itself. If it would not make sense for
+ * both panes to be visible all the time on a sufficiently wide screen, DrawerLayout and its
+ * associated patterns are likely to be a better choice for your usage.</p>
+ */
+public class SlidingPaneLayoutActivity extends Activity {
+ private SlidingPaneLayout mSlidingLayout;
+ private ListView mList;
+ private TextView mContent;
+
+ private ActionBarHelper mActionBar;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.sliding_pane_layout);
+
+ mSlidingLayout = (SlidingPaneLayout) findViewById(R.id.sliding_pane_layout);
+ mList = (ListView) findViewById(R.id.left_pane);
+ mContent = (TextView) findViewById(R.id.content_text);
+
+ mSlidingLayout.setPanelSlideListener(new SliderListener());
+ mSlidingLayout.openPane();
+
+ mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
+ Shakespeare.TITLES));
+ mList.setOnItemClickListener(new ListItemClickListener());
+
+ mActionBar = createActionBarHelper();
+ mActionBar.init();
+
+ mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(new FirstLayoutListener());
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ /*
+ * The action bar up action should open the slider if it is currently closed,
+ * as the left pane contains content one level up in the navigation hierarchy.
+ */
+ if (item.getItemId() == android.R.id.home && !mSlidingLayout.isOpen()) {
+ mSlidingLayout.smoothSlideOpen();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * This list item click listener implements very simple view switching by changing
+ * the primary content text. The slider is closed when a selection is made to fully
+ * reveal the content.
+ */
+ private class ListItemClickListener implements ListView.OnItemClickListener {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ mContent.setText(Shakespeare.DIALOGUE[position]);
+ mActionBar.setTitle(Shakespeare.TITLES[position]);
+ mSlidingLayout.smoothSlideClosed();
+ }
+ }
+
+ /**
+ * This panel slide listener updates the action bar accordingly for each panel state.
+ */
+ private class SliderListener extends SlidingPaneLayout.SimplePanelSlideListener {
+ @Override
+ public void onPanelOpened(View panel) {
+ mActionBar.onPanelOpened();
+ }
+
+ @Override
+ public void onPanelClosed(View panel) {
+ mActionBar.onPanelClosed();
+ }
+ }
+
+ /**
+ * This global layout listener is used to fire an event after first layout occurs
+ * and then it is removed. This gives us a chance to configure parts of the UI
+ * that adapt based on available space after they have had the opportunity to measure
+ * and layout.
+ */
+ private class FirstLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
+ @Override
+ public void onGlobalLayout() {
+ mActionBar.onFirstLayout();
+ mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ }
+ }
+
+ /**
+ * Create a compatible helper that will manipulate the action bar if available.
+ */
+ private ActionBarHelper createActionBarHelper() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return new ActionBarHelperICS();
+ } else {
+ return new ActionBarHelper();
+ }
+ }
+
+ /**
+ * Stub action bar helper; this does nothing.
+ */
+ private class ActionBarHelper {
+ public void init() {}
+ public void onPanelClosed() {}
+ public void onPanelOpened() {}
+ public void onFirstLayout() {}
+ public void setTitle(CharSequence title) {}
+ }
+
+ /**
+ * Action bar helper for use on ICS and newer devices.
+ */
+ private class ActionBarHelperICS extends ActionBarHelper {
+ private final ActionBar mActionBar;
+ private CharSequence mDrawerTitle;
+ private CharSequence mTitle;
+
+ ActionBarHelperICS() {
+ mActionBar = getActionBar();
+ }
+
+ @Override
+ public void init() {
+ mActionBar.setDisplayHomeAsUpEnabled(true);
+ mActionBar.setHomeButtonEnabled(true);
+ mTitle = mDrawerTitle = getTitle();
+ }
+
+ @Override
+ public void onPanelClosed() {
+ super.onPanelClosed();
+ mActionBar.setDisplayHomeAsUpEnabled(true);
+ mActionBar.setHomeButtonEnabled(true);
+ mActionBar.setTitle(mTitle);
+ }
+
+ @Override
+ public void onPanelOpened() {
+ super.onPanelOpened();
+ mActionBar.setHomeButtonEnabled(false);
+ mActionBar.setDisplayHomeAsUpEnabled(false);
+ mActionBar.setTitle(mDrawerTitle);
+ }
+
+ @Override
+ public void onFirstLayout() {
+ if (mSlidingLayout.canSlide() && !mSlidingLayout.isOpen()) {
+ onPanelClosed();
+ } else {
+ onPanelOpened();
+ }
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ mTitle = title;
+ }
+ }
+
+}
diff --git a/samples/training/NavigationDrawer/AndroidManifest.xml b/samples/training/NavigationDrawer/AndroidManifest.xml
new file mode 100755
index 0000000..e48ee24
--- /dev/null
+++ b/samples/training/NavigationDrawer/AndroidManifest.xml
@@ -0,0 +1,40 @@
+<!--
+ Copyright 2013 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.example.android.navigationdrawerexample"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
+
+ <application
+ android:label="@string/app_name"
+ android:icon="@drawable/ic_launcher"
+ android:theme="@android:style/Theme.Holo.Light.DarkActionBar">
+
+ <activity
+ android:name=".MainActivity"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ </application>
+
+</manifest>
diff --git a/samples/training/NavigationDrawer/libs/android-support-v4.jar b/samples/training/NavigationDrawer/libs/android-support-v4.jar
new file mode 100644
index 0000000..ee6f13a
--- /dev/null
+++ b/samples/training/NavigationDrawer/libs/android-support-v4.jar
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-hdpi/action_search.png b/samples/training/NavigationDrawer/res/drawable-hdpi/action_search.png
new file mode 100755
index 0000000..f12e005
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-hdpi/action_search.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-hdpi/drawer_shadow.9.png b/samples/training/NavigationDrawer/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..224cc4f
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-hdpi/ic_drawer.png b/samples/training/NavigationDrawer/res/drawable-hdpi/ic_drawer.png
new file mode 100644
index 0000000..ff7b1de
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-hdpi/ic_drawer.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-hdpi/ic_launcher.png b/samples/training/NavigationDrawer/res/drawable-hdpi/ic_launcher.png
new file mode 100755
index 0000000..b460d60
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-mdpi/action_search.png b/samples/training/NavigationDrawer/res/drawable-mdpi/action_search.png
new file mode 100755
index 0000000..587d9e0
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-mdpi/action_search.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-mdpi/drawer_shadow.9.png b/samples/training/NavigationDrawer/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..3797f99
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-mdpi/ic_drawer.png b/samples/training/NavigationDrawer/res/drawable-mdpi/ic_drawer.png
new file mode 100644
index 0000000..fb681ba
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-mdpi/ic_drawer.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-mdpi/ic_launcher.png b/samples/training/NavigationDrawer/res/drawable-mdpi/ic_launcher.png
new file mode 100755
index 0000000..dee53f4
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-xhdpi/action_search.png b/samples/training/NavigationDrawer/res/drawable-xhdpi/action_search.png
new file mode 100755
index 0000000..3549f84
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-xhdpi/action_search.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-xhdpi/drawer_shadow.9.png b/samples/training/NavigationDrawer/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..fa3d853
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-xhdpi/ic_drawer.png b/samples/training/NavigationDrawer/res/drawable-xhdpi/ic_drawer.png
new file mode 100644
index 0000000..b9bc3d7
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-xhdpi/ic_drawer.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-xhdpi/ic_launcher.png b/samples/training/NavigationDrawer/res/drawable-xhdpi/ic_launcher.png
new file mode 100755
index 0000000..d4e1215
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable-xxhdpi/ic_launcher.png b/samples/training/NavigationDrawer/res/drawable-xxhdpi/ic_launcher.png
new file mode 100755
index 0000000..2cc3275
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/earth.jpg b/samples/training/NavigationDrawer/res/drawable/earth.jpg
new file mode 100644
index 0000000..6cabbf4
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/earth.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/jupiter.jpg b/samples/training/NavigationDrawer/res/drawable/jupiter.jpg
new file mode 100644
index 0000000..24e8eea
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/jupiter.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/mars.jpg b/samples/training/NavigationDrawer/res/drawable/mars.jpg
new file mode 100644
index 0000000..db253ef
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/mars.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/mercury.jpg b/samples/training/NavigationDrawer/res/drawable/mercury.jpg
new file mode 100644
index 0000000..531790b
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/mercury.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/neptune.jpg b/samples/training/NavigationDrawer/res/drawable/neptune.jpg
new file mode 100644
index 0000000..88467c5
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/neptune.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/saturn.jpg b/samples/training/NavigationDrawer/res/drawable/saturn.jpg
new file mode 100644
index 0000000..8219d18
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/saturn.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/uranus.jpg b/samples/training/NavigationDrawer/res/drawable/uranus.jpg
new file mode 100644
index 0000000..fa32e37
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/uranus.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/drawable/venus.jpg b/samples/training/NavigationDrawer/res/drawable/venus.jpg
new file mode 100644
index 0000000..e04f078
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/drawable/venus.jpg
Binary files differ
diff --git a/samples/training/NavigationDrawer/res/layout/activity_main.xml b/samples/training/NavigationDrawer/res/layout/activity_main.xml
new file mode 100755
index 0000000..f097cd0
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/layout/activity_main.xml
@@ -0,0 +1,47 @@
+<!--
+ Copyright 2013 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.
+ -->
+
+
+<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
+<android.support.v4.widget.DrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- As the main content view, the view below consumes the entire
+ space available using match_parent in both dimensions. -->
+ <FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- android:layout_gravity="start" tells DrawerLayout to treat
+ this as a sliding drawer on the left side for left-to-right
+ languages and on the right side for right-to-left languages.
+ The drawer is given a fixed width in dp and extends the full height of
+ the container. A solid background is used for contrast
+ with the content view. -->
+ <ListView
+ android:id="@+id/left_drawer"
+ android:layout_width="240dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:choiceMode="singleChoice"
+ android:divider="@android:color/transparent"
+ android:dividerHeight="0dp"
+ android:background="#111"/>
+</android.support.v4.widget.DrawerLayout>
diff --git a/samples/training/NavigationDrawer/res/layout/drawer_list_item.xml b/samples/training/NavigationDrawer/res/layout/drawer_list_item.xml
new file mode 100644
index 0000000..ab52575
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/layout/drawer_list_item.xml
@@ -0,0 +1,27 @@
+<!--
+ Copyright 2013 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="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceListItemSmall"
+ android:gravity="center_vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textColor="#fff"
+ android:background="?android:attr/activatedBackgroundIndicator"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"/>
\ No newline at end of file
diff --git a/samples/training/NavigationDrawer/res/layout/fragment_planet.xml b/samples/training/NavigationDrawer/res/layout/fragment_planet.xml
new file mode 100644
index 0000000..4fe5bbe
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/layout/fragment_planet.xml
@@ -0,0 +1,23 @@
+<!--
+ Copyright 2013 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.
+ -->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/image"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#000000"
+ android:gravity="center"
+ android:padding="32dp" />
diff --git a/samples/training/NavigationDrawer/res/menu/main.xml b/samples/training/NavigationDrawer/res/menu/main.xml
new file mode 100644
index 0000000..970c16a
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/menu/main.xml
@@ -0,0 +1,22 @@
+<!--
+ Copyright 2013 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.
+ -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/action_websearch"
+ android:icon="@drawable/action_search"
+ android:title="@string/action_websearch"
+ android:showAsAction="ifRoom|withText" />
+</menu>
\ No newline at end of file
diff --git a/samples/training/NavigationDrawer/res/values/strings.xml b/samples/training/NavigationDrawer/res/values/strings.xml
new file mode 100755
index 0000000..3112f40
--- /dev/null
+++ b/samples/training/NavigationDrawer/res/values/strings.xml
@@ -0,0 +1,33 @@
+<!--
+ Copyright 2013 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="app_name">Navigation Drawer Example</string>
+ <string-array name="planets_array">
+ <item>Mercury</item>
+ <item>Venus</item>
+ <item>Earth</item>
+ <item>Mars</item>
+ <item>Jupiter</item>
+ <item>Saturn</item>
+ <item>Uranus</item>
+ <item>Neptune</item>
+ </string-array>
+ <string name="drawer_open">Open navigation drawer</string>
+ <string name="drawer_close">Close navigation drawer</string>
+ <string name="action_websearch">Web search</string>
+ <string name="app_not_available">Sorry, there\'s no web browser available</string>
+</resources>
diff --git a/samples/training/NavigationDrawer/src/com/example/android/navigationdrawerexample/MainActivity.java b/samples/training/NavigationDrawer/src/com/example/android/navigationdrawerexample/MainActivity.java
new file mode 100755
index 0000000..70ffac3
--- /dev/null
+++ b/samples/training/NavigationDrawer/src/com/example/android/navigationdrawerexample/MainActivity.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2013 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.navigationdrawerexample;
+
+import java.util.Locale;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.SearchManager;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.Toast;
+
+/**
+ * This example illustrates a common usage of the DrawerLayout widget
+ * in the Android support library.
+ * <p/>
+ * <p>When a navigation (left) drawer is present, the host activity should detect presses of
+ * the action bar's Up affordance as a signal to open and close the navigation drawer. The
+ * ActionBarDrawerToggle facilitates this behavior.
+ * Items within the drawer should fall into one of two categories:</p>
+ * <p/>
+ * <ul>
+ * <li><strong>View switches</strong>. A view switch follows the same basic policies as
+ * list or tab navigation in that a view switch does not create navigation history.
+ * This pattern should only be used at the root activity of a task, leaving some form
+ * of Up navigation active for activities further down the navigation hierarchy.</li>
+ * <li><strong>Selective Up</strong>. The drawer allows the user to choose an alternate
+ * parent for Up navigation. This allows a user to jump across an app's navigation
+ * hierarchy at will. The application should treat this as it treats Up navigation from
+ * a different task, replacing the current task stack using TaskStackBuilder or similar.
+ * This is the only form of navigation drawer that should be used outside of the root
+ * activity of a task.</li>
+ * </ul>
+ * <p/>
+ * <p>Right side drawers should be used for actions, not navigation. This follows the pattern
+ * established by the Action Bar that navigation should be to the left and actions to the right.
+ * An action should be an operation performed on the current contents of the window,
+ * for example enabling or disabling a data overlay on top of the current content.</p>
+ */
+public class MainActivity extends Activity {
+ private DrawerLayout mDrawerLayout;
+ private ListView mDrawerList;
+ private ActionBarDrawerToggle mDrawerToggle;
+
+ private CharSequence mDrawerTitle;
+ private CharSequence mTitle;
+ private String[] mPlanetTitles;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ mTitle = mDrawerTitle = getTitle();
+ mPlanetTitles = getResources().getStringArray(R.array.planets_array);
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerList = (ListView) findViewById(R.id.left_drawer);
+
+ // set a custom shadow that overlays the main content when the drawer opens
+ mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+ // set up the drawer's list view with items and click listener
+ mDrawerList.setAdapter(new ArrayAdapter<String>(this,
+ R.layout.drawer_list_item, mPlanetTitles));
+ mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
+
+ // enable ActionBar app icon to behave as action to toggle nav drawer
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ getActionBar().setHomeButtonEnabled(true);
+
+ // ActionBarDrawerToggle ties together the the proper interactions
+ // between the sliding drawer and the action bar app icon
+ mDrawerToggle = new ActionBarDrawerToggle(
+ this, /* host Activity */
+ mDrawerLayout, /* DrawerLayout object */
+ R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
+ R.string.drawer_open, /* "open drawer" description for accessibility */
+ R.string.drawer_close /* "close drawer" description for accessibility */
+ ) {
+ public void onDrawerClosed(View view) {
+ getActionBar().setTitle(mTitle);
+ invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
+ }
+
+ public void onDrawerOpened(View drawerView) {
+ getActionBar().setTitle(mDrawerTitle);
+ invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
+ }
+ };
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+
+ if (savedInstanceState == null) {
+ selectItem(0);
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.main, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ /* Called whenever we call invalidateOptionsMenu() */
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ // If the nav drawer is open, hide action items related to the content view
+ boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
+ menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // The action bar home/up action should open or close the drawer.
+ // ActionBarDrawerToggle will take care of this.
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+ // Handle action buttons
+ switch(item.getItemId()) {
+ case R.id.action_websearch:
+ // create intent to perform web search for this planet
+ Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
+ intent.putExtra(SearchManager.QUERY, getActionBar().getTitle());
+ // catch event that there's no activity to handle intent
+ if (intent.resolveActivity(getPackageManager()) != null) {
+ startActivity(intent);
+ } else {
+ Toast.makeText(this, R.string.app_not_available, Toast.LENGTH_LONG).show();
+ }
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ /* The click listner for ListView in the navigation drawer */
+ private class DrawerItemClickListener implements ListView.OnItemClickListener {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ selectItem(position);
+ }
+ }
+
+ private void selectItem(int position) {
+ // update the main content by replacing fragments
+ Fragment fragment = new PlanetFragment();
+ Bundle args = new Bundle();
+ args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
+ fragment.setArguments(args);
+
+ FragmentManager fragmentManager = getFragmentManager();
+ fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
+
+ // update selected item and title, then close the drawer
+ mDrawerList.setItemChecked(position, true);
+ setTitle(mPlanetTitles[position]);
+ mDrawerLayout.closeDrawer(mDrawerList);
+ }
+
+ @Override
+ public void setTitle(CharSequence title) {
+ mTitle = title;
+ getActionBar().setTitle(mTitle);
+ }
+
+ /**
+ * When using the ActionBarDrawerToggle, you must call it during
+ * onPostCreate() and onConfigurationChanged()...
+ */
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ // Sync the toggle state after onRestoreInstanceState has occurred.
+ mDrawerToggle.syncState();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ // Pass any configuration change to the drawer toggls
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ /**
+ * Fragment that appears in the "content_frame", shows a planet
+ */
+ public static class PlanetFragment extends Fragment {
+ public static final String ARG_PLANET_NUMBER = "planet_number";
+
+ public PlanetFragment() {
+ // Empty constructor required for fragment subclasses
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
+ int i = getArguments().getInt(ARG_PLANET_NUMBER);
+ String planet = getResources().getStringArray(R.array.planets_array)[i];
+
+ int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
+ "drawable", getActivity().getPackageName());
+ ((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
+ getActivity().setTitle(planet);
+ return rootView;
+ }
+ }
+}
\ No newline at end of file
diff --git a/scripts/app_engine_server/redirects.yaml b/scripts/app_engine_server/redirects.yaml
index 0b957d1..88b1f46 100644
--- a/scripts/app_engine_server/redirects.yaml
+++ b/scripts/app_engine_server/redirects.yaml
@@ -110,6 +110,18 @@
type: permanent
comment: Redirect sdk reference to new location
+- src: /tools/sdk/win-usb.html
+ dst: /sdk/win-usb.html
+ type: permanent
+
+- src: /tools/sdk/index.html
+ dst: /sdk/index.html
+ type: permanent
+
+- src: /tools/sdk/installing.html
+ dst: /sdk/installing/bundle.html
+ type: permanent
+
#new one works
- src: /sdk/requirements.html
dst: /sdk/index.html
@@ -237,6 +249,26 @@
dst: /tools/adk/index.html
type: permanent
+- src: /tools/workflow/publishing/versioning.html
+ dst: /tools/publishing/versioning.html
+ type: permanent
+
+- src: /tools/workflow/publishing/publishing.html
+ dst: /tools/publishing/publishing_overview.html
+ type: permanent
+
+- src: /tools/workflow/publishing_overview.html
+ dst: /tools/publishing/publishing_overview.html
+ type: permanent
+
+- src: /tools/workflow/publishing/publishing_overview.html
+ dst: /tools/publishing/publishing_overview.html
+ type: permanent
+
+- src: /tools/workflow/app-signing.html
+ dst: /tools/publishing/app-signing.html
+ type: permanent
+
- src: /tools/adk/aoa.html
dst: http://source.android.com/tech/accessories/aoap/aoa.html
type: permanent
@@ -614,10 +646,10 @@
dst: http://developer.android.com/distribute/promote/device-art.html
type: permanent
-- src: /edu
- dst: /distribute/googleplay/edu/index.html
- type: permanent
-
- src: /edu/signup
dst: https://services.google.com/fb/forms/playedu
type: permanent
+
+- src: /edu
+ dst: /distribute/googleplay/edu/index.html
+ type: permanent
diff --git a/sdk/support_source.properties b/sdk/support_source.properties
index 9b4281a..433fba9 100644
--- a/sdk/support_source.properties
+++ b/sdk/support_source.properties
@@ -1,5 +1,5 @@
Pkg.UserSrc=false
-Pkg.Revision=12
+Pkg.Revision=13
Extra.Vendor=android
Extra.VendorId=android
Extra.VendorDisplay=Android
diff --git a/testrunner/test_defs.xml b/testrunner/test_defs.xml
index 8494cb0..25f23e2 100644
--- a/testrunner/test_defs.xml
+++ b/testrunner/test_defs.xml
@@ -85,6 +85,11 @@
coverage_target="framework"
continuous="true" />
+<test name="frameworks-support"
+ build_path="frameworks/support/tests"
+ package="android.support.tests"
+ continuous="true" />
+
<test name="core"
build_path="frameworks/base/tests/CoreTests"
package="android.core"