diff --git a/samples/README.md b/samples/README.md
deleted file mode 100644
index 2c461e8..0000000
--- a/samples/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-ActionBarSherlock Samples
-=========================
-
-See [actionbarsherlock.com/samples.html][1] for information on the samples
-contained in this folder as well as a list of open source implementations.
-
-
-
-
-
-
-
- [1]: http://actionbarsherlock.com/samples.html
diff --git a/samples/demos/AndroidManifest.xml b/samples/demos/AndroidManifest.xml
deleted file mode 100644
index 0d489ed..0000000
--- a/samples/demos/AndroidManifest.xml
+++ /dev/null
@@ -1,188 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="90" android:versionName="4.1.0" package="com.actionbarsherlock.sample.demos">
-
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15"/>
-
-    <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
-
-    <application android:icon="@drawable/icon" android:label="@string/application_name">
-
-        <activity android:label="@string/activity_name" android:name=".SampleList" android:theme="@style/Theme.Sherlock">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-
-
-        <activity android:label="@string/action_items" android:name=".ActionItems">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/action_modes" android:name=".ActionModes">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/action_modes_no_action_bar" android:name=".ActionModesNoActionBar">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/action_providers" android:name=".ActionProviders">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/collapsible" android:name=".CollapsibleActionItem">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/context_menus" android:name=".ContextMenus">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/custom_navigation" android:name=".CustomNavigation">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/dialog" android:name=".Dialog" android:theme="@style/Theme.Sherlock.Dialog">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/feature_toggles" android:name=".FeatureToggles">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/forced_overflow" android:name=".ForcedOverflowItem">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/iprogress" android:name=".IndeterminateProgress">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/list_navigation" android:name=".ListNavigation">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/overlay" android:name=".Overlay">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/preference" android:name=".Preference">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/progress" android:name=".Progress">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/simple" android:name=".Simple">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/split" android:name=".SplitActionItems" android:uiOptions="splitActionBarWhenNarrow">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/share_action_providers" android:name=".ShareActionProviders">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/split_action_modes" android:name=".SplitActionModes" android:uiOptions="splitActionBarWhenNarrow">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/static_attach" android:name=".StaticAttachment">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/styled" android:name=".Styled" android:theme="@style/Theme.Styled" android:uiOptions="splitActionBarWhenNarrow">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/submenus" android:name=".SubMenus">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/tab_navigation" android:name=".TabNavigation">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/tab_navigation_collapsed" android:name=".TabNavigationCollapsed">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-    </application>
-</manifest>
diff --git a/samples/demos/README.md b/samples/demos/README.md
deleted file mode 100644
index a0198bf..0000000
--- a/samples/demos/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-ActionBarSherlock Sample: Demos
-===============================
-
-See [actionbarsherlock.com/samples.html][1] for information on the sample
-contained in this folder.
-
-
-
-
-
-
-
- [1]: http://actionbarsherlock.com/samples.html
diff --git a/samples/demos/libs/android-support-v4.jar b/samples/demos/libs/android-support-v4.jar
deleted file mode 100644
index 99e063b..0000000
--- a/samples/demos/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/samples/demos/pom.xml b/samples/demos/pom.xml
deleted file mode 100644
index c6a0146..0000000
--- a/samples/demos/pom.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.actionbarsherlock</groupId>
-	<artifactId>sample-demos</artifactId>
-	<name>Sample: Demos</name>
-	<packaging>apk</packaging>
-
-	<parent>
-		<groupId>com.actionbarsherlock</groupId>
-		<artifactId>parent-sample</artifactId>
-		<version>4.1.0</version>
-		<relativePath>../pom.xml</relativePath>
-	</parent>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.google.android</groupId>
-			<artifactId>android</artifactId>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.actionbarsherlock</groupId>
-			<artifactId>library</artifactId>
-			<version>${project.version}</version>
-			<type>apklib</type>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<sourceDirectory>src</sourceDirectory>
-		<finalName>${apk.prefix}-${project.artifactId}-${project.version}-unaligned</finalName>
-
-		<plugins>
-			<plugin>
-				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
-				<artifactId>android-maven-plugin</artifactId>
-				<extensions>true</extensions>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>zipalign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jarsigner-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>sign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-checkstyle-plugin</artifactId>
-				<configuration>
-					<configLocation>../../checkstyle.xml</configLocation>
-				</configuration>
-				<executions>
-					<execution>
-						<phase>verify</phase>
-						<goals>
-							<goal>checkstyle</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-
-	<profiles>
-		<profile>
-			<id>abs-release</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>com.github.github</groupId>
-						<artifactId>downloads-maven-plugin</artifactId>
-						<executions>
-							<execution>
-								<phase>deploy</phase>
-								<goals>
-									<goal>upload</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-</project>
diff --git a/samples/demos/project.properties b/samples/demos/project.properties
deleted file mode 100644
index d29d6c7..0000000
--- a/samples/demos/project.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-14
-android.library.reference.1=../../library
-
-
-
-
-
diff --git a/samples/demos/res/drawable-hdpi/bg_striped_img.png b/samples/demos/res/drawable-hdpi/bg_striped_img.png
deleted file mode 100644
index ab8487a..0000000
--- a/samples/demos/res/drawable-hdpi/bg_striped_img.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/bg_striped_split_img.png b/samples/demos/res/drawable-hdpi/bg_striped_split_img.png
deleted file mode 100644
index 4c780ea..0000000
--- a/samples/demos/res/drawable-hdpi/bg_striped_split_img.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_compose.png b/samples/demos/res/drawable-hdpi/ic_compose.png
deleted file mode 100644
index cdb09e4..0000000
--- a/samples/demos/res/drawable-hdpi/ic_compose.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_compose_inverse.png b/samples/demos/res/drawable-hdpi/ic_compose_inverse.png
deleted file mode 100644
index 8a0c487..0000000
--- a/samples/demos/res/drawable-hdpi/ic_compose_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_launcher_settings.png b/samples/demos/res/drawable-hdpi/ic_launcher_settings.png
deleted file mode 100644
index c02bd42..0000000
--- a/samples/demos/res/drawable-hdpi/ic_launcher_settings.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_magnifying_glass.png b/samples/demos/res/drawable-hdpi/ic_magnifying_glass.png
deleted file mode 100644
index cdf3518..0000000
--- a/samples/demos/res/drawable-hdpi/ic_magnifying_glass.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_refresh.png b/samples/demos/res/drawable-hdpi/ic_refresh.png
deleted file mode 100644
index 08c32e0..0000000
--- a/samples/demos/res/drawable-hdpi/ic_refresh.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_refresh_inverse.png b/samples/demos/res/drawable-hdpi/ic_refresh_inverse.png
deleted file mode 100644
index 9ab1d38..0000000
--- a/samples/demos/res/drawable-hdpi/ic_refresh_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_search.png b/samples/demos/res/drawable-hdpi/ic_search.png
deleted file mode 100644
index 59de344..0000000
--- a/samples/demos/res/drawable-hdpi/ic_search.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_search_inverse.png b/samples/demos/res/drawable-hdpi/ic_search_inverse.png
deleted file mode 100644
index eb090a6..0000000
--- a/samples/demos/res/drawable-hdpi/ic_search_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/ic_title_share_default.png b/samples/demos/res/drawable-hdpi/ic_title_share_default.png
deleted file mode 100644
index ee4b285..0000000
--- a/samples/demos/res/drawable-hdpi/ic_title_share_default.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-hdpi/icon.png b/samples/demos/res/drawable-hdpi/icon.png
deleted file mode 100644
index 723fbf0..0000000
--- a/samples/demos/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-ldpi/icon.png b/samples/demos/res/drawable-ldpi/icon.png
deleted file mode 100644
index 181f679..0000000
--- a/samples/demos/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/bg_striped_img.png b/samples/demos/res/drawable-mdpi/bg_striped_img.png
deleted file mode 100644
index 06e3ebd..0000000
--- a/samples/demos/res/drawable-mdpi/bg_striped_img.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/bg_striped_split_img.png b/samples/demos/res/drawable-mdpi/bg_striped_split_img.png
deleted file mode 100644
index 1308ade..0000000
--- a/samples/demos/res/drawable-mdpi/bg_striped_split_img.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_compose.png b/samples/demos/res/drawable-mdpi/ic_compose.png
deleted file mode 100644
index 15a4130..0000000
--- a/samples/demos/res/drawable-mdpi/ic_compose.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_compose_inverse.png b/samples/demos/res/drawable-mdpi/ic_compose_inverse.png
deleted file mode 100644
index de58ce8..0000000
--- a/samples/demos/res/drawable-mdpi/ic_compose_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_launcher_settings.png b/samples/demos/res/drawable-mdpi/ic_launcher_settings.png
deleted file mode 100644
index 05cdd9a..0000000
--- a/samples/demos/res/drawable-mdpi/ic_launcher_settings.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_magnifying_glass.png b/samples/demos/res/drawable-mdpi/ic_magnifying_glass.png
deleted file mode 100644
index 53aa6d9..0000000
--- a/samples/demos/res/drawable-mdpi/ic_magnifying_glass.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_refresh.png b/samples/demos/res/drawable-mdpi/ic_refresh.png
deleted file mode 100644
index 55c43c3..0000000
--- a/samples/demos/res/drawable-mdpi/ic_refresh.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_refresh_inverse.png b/samples/demos/res/drawable-mdpi/ic_refresh_inverse.png
deleted file mode 100644
index d5736ec..0000000
--- a/samples/demos/res/drawable-mdpi/ic_refresh_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_search.png b/samples/demos/res/drawable-mdpi/ic_search.png
deleted file mode 100644
index 75339d9..0000000
--- a/samples/demos/res/drawable-mdpi/ic_search.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/ic_search_inverse.png b/samples/demos/res/drawable-mdpi/ic_search_inverse.png
deleted file mode 100644
index b462c32..0000000
--- a/samples/demos/res/drawable-mdpi/ic_search_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-mdpi/icon.png b/samples/demos/res/drawable-mdpi/icon.png
deleted file mode 100644
index 79f50d8..0000000
--- a/samples/demos/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-xhdpi/bg_striped_img.png b/samples/demos/res/drawable-xhdpi/bg_striped_img.png
deleted file mode 100644
index 92f3fa1..0000000
--- a/samples/demos/res/drawable-xhdpi/bg_striped_img.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-xhdpi/bg_striped_split_img.png b/samples/demos/res/drawable-xhdpi/bg_striped_split_img.png
deleted file mode 100644
index e31f4a6..0000000
--- a/samples/demos/res/drawable-xhdpi/bg_striped_split_img.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-xhdpi/ic_launcher_settings.png b/samples/demos/res/drawable-xhdpi/ic_launcher_settings.png
deleted file mode 100644
index 2b2907b..0000000
--- a/samples/demos/res/drawable-xhdpi/ic_launcher_settings.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable-xhdpi/icon.png b/samples/demos/res/drawable-xhdpi/icon.png
deleted file mode 100644
index 34ca9a4..0000000
--- a/samples/demos/res/drawable-xhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/drawable/bg_striped.xml b/samples/demos/res/drawable/bg_striped.xml
deleted file mode 100644
index 77e0aab..0000000
--- a/samples/demos/res/drawable/bg_striped.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/bg_striped_img"
-    android:tileMode="repeat"
-    android:dither="true" />
\ No newline at end of file
diff --git a/samples/demos/res/drawable/bg_striped_split.xml b/samples/demos/res/drawable/bg_striped_split.xml
deleted file mode 100644
index 9b0e313..0000000
--- a/samples/demos/res/drawable/bg_striped_split.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/bg_striped_split_img"
-    android:tileMode="repeat"
-    android:dither="true" />
\ No newline at end of file
diff --git a/samples/demos/res/layout-large-land/feature_toggles.xml b/samples/demos/res/layout-large-land/feature_toggles.xml
deleted file mode 100644
index 359f298..0000000
--- a/samples/demos/res/layout-large-land/feature_toggles.xml
+++ /dev/null
@@ -1,393 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-    <ScrollView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content">
-        <LinearLayout
-            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/feature_toggles_content"
-                android:padding="15dp"
-                android:layout_marginBottom="20dp" />
-
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal">
-                <LinearLayout
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:orientation="vertical"
-                    android:padding="15dip">
-
-                    <!-- ACTION BAR DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="ActionBar Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_actionbar_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_actionbar_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-
-                    <!-- NAVIGATION MODE -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Navigation Mode" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/navigation_standard"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Standard" />
-                        <Button
-                            android:id="@+id/navigation_list"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="List" />
-                        <Button
-                            android:id="@+id/navigation_tabs"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Tabs" />
-                    </LinearLayout>
-
-                    <!-- TAB DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Tab Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_tab_add"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Add" />
-                        <Button
-                            android:id="@+id/display_tab_select"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Select Random" />
-                    </LinearLayout>
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_tab_remove"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Remove" />
-                        <Button
-                            android:id="@+id/display_tab_remove_all"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Remove All" />
-                    </LinearLayout>
-
-                    <!-- TITLE DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Title Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_title_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_title_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-
-                    <!-- SUBTITLE DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Subtitle Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_subtitle_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_subtitle_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-                </LinearLayout>
-                <LinearLayout
-                    android:layout_width="0dp"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:orientation="vertical"
-                    android:padding="15dip">
-
-                    <!-- ACTION ITEMS DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Action Items Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_items_add"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Add" />
-                        <Button
-                            android:id="@+id/display_items_clear"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Remove All" />
-                    </LinearLayout>
-
-                    <!-- CUSTOM VIEW DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Custom View Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_custom_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_custom_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-
-                    <!-- HOME DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Home Action Item Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_home_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_home_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-
-                    <!-- LOGO DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Logo Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_logo_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Use" />
-                        <Button
-                            android:id="@+id/display_logo_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Do Not Use" />
-                    </LinearLayout>
-
-                    <!-- HOME AS UP DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Home As Up Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_home_as_up_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_home_as_up_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-
-                    <!-- PROGESS DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Progress Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_progress_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_progress_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-
-                    <!-- INDETERMINATE PROGESS DISPLAY -->
-                    <TextView
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_marginBottom="2dip"
-                        android:text="Indeterminate Progress Display" />
-                    <LinearLayout
-                        android:layout_width="fill_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="horizontal"
-                        android:layout_marginBottom="10dip">
-                        <Button
-                            android:id="@+id/display_iprogress_show"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Show" />
-                        <Button
-                            android:id="@+id/display_iprogress_hide"
-                            android:layout_width="fill_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_weight="1"
-                            android:gravity="center"
-                            android:text="Hide" />
-                    </LinearLayout>
-                </LinearLayout>
-            </LinearLayout>
-        </LinearLayout>
-    </ScrollView>
-</LinearLayout>
diff --git a/samples/demos/res/layout/action_modes.xml b/samples/demos/res/layout/action_modes.xml
deleted file mode 100644
index dd9b0c4..0000000
--- a/samples/demos/res/layout/action_modes.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:padding="20dip">
-    <LinearLayout
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:orientation="horizontal">
-        <Button
-            android:id="@+id/start"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="10dp"
-            android:text="Start" />
-        <Button
-            android:id="@+id/cancel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Cancel" />
-    </LinearLayout>
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="20dp"
-        android:text="@string/action_modes_content"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/collapsible_edittext.xml b/samples/demos/res/layout/collapsible_edittext.xml
deleted file mode 100644
index d1bd064..0000000
--- a/samples/demos/res/layout/collapsible_edittext.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<EditText xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="wrap_content"
-    android:hint="Search"/>
diff --git a/samples/demos/res/layout/context_menus.xml b/samples/demos/res/layout/context_menus.xml
deleted file mode 100644
index e5d796e..0000000
--- a/samples/demos/res/layout/context_menus.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:padding="20dip">
-    <LinearLayout
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal"
-        android:orientation="horizontal">
-        <Button
-            android:id="@+id/show_context_menu"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="10dp"
-            android:text="Long-Press Me" />
-    </LinearLayout>
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="20dp"
-        android:text="@string/context_menus_content"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/custom_view.xml b/samples/demos/res/layout/custom_view.xml
deleted file mode 100644
index 43a8a0c..0000000
--- a/samples/demos/res/layout/custom_view.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="fill_parent"
-    android:gravity="left|center_vertical"
-    android:orientation="horizontal"
-    >
-    <RadioGroup
-        android:id="@+id/radio_nav"
-        android:orientation="horizontal"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-    >
-        <RadioButton
-            android:text="Custom"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-        />
-        <RadioButton
-            android:text="View!"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-        />
-    </RadioGroup>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/feature_toggles.xml b/samples/demos/res/layout/feature_toggles.xml
deleted file mode 100644
index 7d0f796..0000000
--- a/samples/demos/res/layout/feature_toggles.xml
+++ /dev/null
@@ -1,373 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-    <ScrollView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content">
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            android:padding="15dip">
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:text="@string/feature_toggles_content"
-                android:layout_marginBottom="20dp" />
-            
-            <!-- ACTION BAR DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="ActionBar Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_actionbar_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_actionbar_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- NAVIGATION MODE -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Navigation Mode" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/navigation_standard"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Standard" />
-                <Button
-                    android:id="@+id/navigation_list"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="List" />
-                <Button
-                    android:id="@+id/navigation_tabs"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Tabs" />
-            </LinearLayout>
-	            
-            <!-- TAB DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Tab Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_tab_add"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Add" />
-                <Button
-                    android:id="@+id/display_tab_select"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Select Random" />
-            </LinearLayout>
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_tab_remove"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Remove" />
-                <Button
-                    android:id="@+id/display_tab_remove_all"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Remove All" />
-            </LinearLayout>
-            
-            <!-- ACTION ITEMS DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Action Items Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_items_add"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Add" />
-                <Button
-                    android:id="@+id/display_items_clear"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Remove All" />
-            </LinearLayout>
-            
-            <!-- TITLE DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Title Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_title_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_title_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- SUBTITLE DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Subtitle Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_subtitle_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_subtitle_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- CUSTOM VIEW DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Custom View Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_custom_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_custom_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- HOME DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Home Action Item Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_home_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_home_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- LOGO DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Logo Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_logo_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Use" />
-                <Button
-                    android:id="@+id/display_logo_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Do Not Use" />
-            </LinearLayout>
-            
-            <!-- HOME AS UP DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Home As Up Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_home_as_up_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_home_as_up_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- PROGESS DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Progress Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_progress_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_progress_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-            
-            <!-- INDETERMINATE PROGESS DISPLAY -->
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="2dip"
-                android:text="Indeterminate Progress Display" />
-            <LinearLayout
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:layout_marginBottom="10dip">
-                <Button
-                    android:id="@+id/display_iprogress_show"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Show" />
-                <Button
-                    android:id="@+id/display_iprogress_hide"
-                    android:layout_width="fill_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:gravity="center"
-                    android:text="Hide" />
-            </LinearLayout>
-        </LinearLayout>
-    </ScrollView>
-</LinearLayout>
diff --git a/samples/demos/res/layout/iprogress.xml b/samples/demos/res/layout/iprogress.xml
deleted file mode 100644
index 5f1ca7d..0000000
--- a/samples/demos/res/layout/iprogress.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:padding="20dip">
-    <LinearLayout
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal">
-        <Button
-            android:id="@+id/enable"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="10dp"
-            android:text="Enable" />
-        <Button
-            android:id="@+id/disable"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:text="Disable" />
-    </LinearLayout>
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="20dp"
-        android:text="@string/iprogress_content" />
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/list_navigation.xml b/samples/demos/res/layout/list_navigation.xml
deleted file mode 100644
index 55254ae..0000000
--- a/samples/demos/res/layout/list_navigation.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:padding="20dip">
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="20dp"
-        android:text="@string/list_navigation_content" />
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/overlay.xml b/samples/demos/res/layout/overlay.xml
deleted file mode 100644
index adc4565..0000000
--- a/samples/demos/res/layout/overlay.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-    <ScrollView
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent">
-        <LinearLayout
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:paddingLeft="10dp"
-            android:paddingRight="10dp"
-            android:paddingTop="?actionBarSize"
-            android:orientation="vertical">
-            <TextView
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="10dp"
-                android:layout_marginBottom="30dp"
-                android:text="@string/overlay_content" />
-            <TextView
-                android:id="@+id/bunch_of_text"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content" />
-        </LinearLayout>
-    </ScrollView>
-</FrameLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/preferences.xml b/samples/demos/res/layout/preferences.xml
deleted file mode 100644
index d2e1e83..0000000
--- a/samples/demos/res/layout/preferences.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
-    android:layout_width="fill_parent" 
-    android:layout_height="fill_parent"
-    android:drawSelectorOnTop="false"
-    android:scrollbarAlwaysDrawVerticalTrack="true"
-    />
\ No newline at end of file
diff --git a/samples/demos/res/layout/progress.xml b/samples/demos/res/layout/progress.xml
deleted file mode 100644
index fe47c61..0000000
--- a/samples/demos/res/layout/progress.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:gravity="center_horizontal"
-    android:padding="20dip">
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="20dp"
-        android:text="@string/progress_content" />
-    <Button
-        android:id="@+id/go"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingLeft="40dp"
-        android:paddingRight="40dp"
-        android:text="Go" />
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/settings_action_provider.xml b/samples/demos/res/layout/settings_action_provider.xml
deleted file mode 100644
index 969332a..0000000
--- a/samples/demos/res/layout/settings_action_provider.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:layout_gravity="center"
-    android:focusable="true"
-    android:addStatesFromChildren="true"
-    android:background="?attr/actionBarItemBackground"
-    style="?attr/actionButtonStyle">
-
-    <ImageButton android:id="@+id/button"
-        android:background="@drawable/ic_launcher_settings"
-        android:layout_width="32dip"
-        android:layout_height="32dip"
-        android:layout_gravity="center"
-        android:scaleType="fitCenter"
-        android:adjustViewBounds="true" />
-
-</LinearLayout>
diff --git a/samples/demos/res/layout/tab_custom_view.xml b/samples/demos/res/layout/tab_custom_view.xml
deleted file mode 100644
index a091411..0000000
--- a/samples/demos/res/layout/tab_custom_view.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent">
-    <ProgressBar
-    	android:layout_width="wrap_content"
-    	android:layout_height="wrap_content"
-    	android:indeterminate="true"/>
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/tab_navigation.xml b/samples/demos/res/layout/tab_navigation.xml
deleted file mode 100644
index 7b7f989..0000000
--- a/samples/demos/res/layout/tab_navigation.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:padding="20dip">
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="20dp"
-        android:text="@string/tab_navigation_content" />
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/layout/text.xml b/samples/demos/res/layout/text.xml
deleted file mode 100644
index 77dcd21..0000000
--- a/samples/demos/res/layout/text.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical"
-    android:padding="20dip">
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
-</LinearLayout>
\ No newline at end of file
diff --git a/samples/demos/res/menu/settings_action_provider.xml b/samples/demos/res/menu/settings_action_provider.xml
deleted file mode 100644
index 0a9b0ce..0000000
--- a/samples/demos/res/menu/settings_action_provider.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 Google Inc.
-
-     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/menu_item_action_provider_action_bar"
-        android:showAsAction="ifRoom"
-        android:title="Settings"
-        android:actionProviderClass="com.actionbarsherlock.sample.demos.ActionProviders$SettingsActionProvider"/>
-
-    <item android:id="@+id/menu_item_action_provider_overflow"
-        android:showAsAction="never"
-        android:title="Settings"
-        android:actionProviderClass="com.actionbarsherlock.sample.demos.ActionProviders$SettingsActionProvider"/>
-
-</menu>
diff --git a/samples/demos/res/menu/share_action_provider.xml b/samples/demos/res/menu/share_action_provider.xml
deleted file mode 100644
index 6b05235..0000000
--- a/samples/demos/res/menu/share_action_provider.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 Google Inc.
-
-     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/menu_item_share_action_provider_action_bar"
-        android:showAsAction="always"
-        android:title="@string/action_bar_share_with"
-        android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" />
-
-    <!-- XXX: For now, ShareActionProviders must be displayed on the action bar -->
-    <!--item android:id="@+id/menu_item_share_action_provider_overflow"
-        android:showAsAction="never"
-        android:title="@string/action_bar_share_with"
-        android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" /-->
-
-</menu>
diff --git a/samples/demos/res/raw/robot.png b/samples/demos/res/raw/robot.png
deleted file mode 100644
index 8a9e698..0000000
--- a/samples/demos/res/raw/robot.png
+++ /dev/null
Binary files differ
diff --git a/samples/demos/res/values/arrays.xml b/samples/demos/res/values/arrays.xml
deleted file mode 100644
index 19eb537..0000000
--- a/samples/demos/res/values/arrays.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string-array name="entries_list_preference">
-        <item>Alpha Option 01</item>
-        <item>Beta Option 02</item>
-        <item>Charlie Option 03</item>  
-    </string-array>
-
-    <string-array name="entryvalues_list_preference">
-        <item>alpha</item>
-        <item>beta</item>
-        <item>charlie</item>  
-    </string-array>
-    
-    <string-array name="locations">
-        <item>Home</item>
-        <item>Email</item>
-        <item>Calendar</item>
-        <item>Browser</item>
-        <item>Clock</item>
-    </string-array>
-</resources>
diff --git a/samples/demos/res/values/colors.xml b/samples/demos/res/values/colors.xml
deleted file mode 100644
index 2e2ad74..0000000
--- a/samples/demos/res/values/colors.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-	<drawable name="ab_bg_black">#aa000000</drawable>
-</resources>
diff --git a/samples/demos/res/values/strings.xml b/samples/demos/res/values/strings.xml
deleted file mode 100644
index 610235a..0000000
--- a/samples/demos/res/values/strings.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <string name="application_name">ActionBarSherlock Demos</string>
-    <string name="activity_name">ABS: Demos</string>
-
-
-
-    <string name="action_items">Action Items</string>
-    <string name="action_items_content">The action bar creates a unified and persistant navigation experience for your application and action items are a great way to provide a clear indication of what the user can do.</string>
-
-    <string name="action_modes">Action Modes</string>
-    <string name="action_modes_content">Action modes are used to display contextual information based on some interaction made by the user (long press, checkbox selection, etc). Like the normal action bar they also support splitting the action items to the bottom of the screen on small devices.</string>
-
-    <string name="action_modes_no_action_bar">Action Modes (No Action Bar)</string>
-
-    <string name="share_action_providers">Share Action Providers</string>
-    <string name="share_action_providers_content">This activity demonstrates how to use an 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.\n\nFor now, ShareActionProviders must be displayed on the action bar</string>
-
-    <string name="action_providers">Action Providers</string>
-    <string name="action_providers_content">This activity demonstrates how to implement an 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.</string>
-
-    <string name="collapsible">Collapsible Action Items</string>
-    <string name="collapsible_content">This activity is a demonstration of how collapsible action items work. When you are concerned about the available room for items on small screens you should use this feature.</string>
-
-    <string name="context_menus">Context Menus</string>
-    <string name="context_menus_content">Since both ActionBarSherlock and Android use \'Menu\' and \'MenuItem\' class names you must take extra care when using context menus. It is still very much possible to use both in a single activity.</string>
-
-    <string name="custom_navigation">Custom Navigation</string>
-    <string name="custom_navigation_content">If you find that list and tab navigation are not suitable for your application you may replace it with a custom layout.</string>
-
-    <string name="dialog">Dialog</string>
-    <string name="dialog_content">This is a demonstration of how you can give an activity the look of a dialog.\n\nWhile there is a light version of this theme, it cannot be set programmatically without disabling the fancy transparent outer background. In order for this effect the theme must be set in the manifest.</string>
-
-    <string name="feature_toggles">Feature Toggles</string>
-    <string name="feature_toggles_content">Use these buttons to create various configurations with the action bar to see how it behaves.</string>
-
-    <string name="forced_overflow">Forced Overflow Item</string>
-    <string name="forced_overflow_content">If you choose, you can force the presence of the overflow menu as an action item. Google\'s own research indicates that the regular options menu is lost on most users and doing this will place it always on screen. You can use a theme ending in `ForceOverflow` or add the `absForceOverflow` attribute to a custom theme.\n\nNote: This will only work on the pre-ICS action bar.</string>
-
-    <string name="iprogress">Indeterminate Progress</string>
-    <string name="iprogress_content">The action bar includes a standard indeterminate progress bar. The methods for accessing it are prefixed with `support`. See the source for this demo for more information.</string>
-
-    <string name="list_navigation">List Navigation</string>
-    <string name="list_navigation_content">List navigation requires the use of a special layout for the spinner item. Failure to use it will result in your spinner text being the same color as the action bar background on pre-3.0. See the source code of this demo for more information.</string>
-
-    <string name="overlay">Overlay</string>
-    <string name="overlay_content">Overlay can be useful if you have a lot of scrolling content, especially if that content is images. Remember to lead your content with a margin so that it starts below the action bar when scrolled to the top.</string>
-
-    <string name="preference">Preference</string>
-    <string name="preference_content">You can use the `SherlockPreferenceActivity` base class to place the action bar on top of a normal `PreferenceActivity`.\n\nThis does not yet support the use of `PreferenceFragments`, however.</string>
-
-    <string name="progress">Progress</string>
-    <string name="progress_content">The action bar includes a standard progress bar. The methods for accessing it are prefixed with `support`. See the source for this demo for more information.</string>
-
-    <string name="simple">Simple</string>
-    <string name="simple_content">This is a simple showcase of how easy it is to add the action bar to your activities. Take a look at the source code, it\'s surprisingly simple!</string>
-
-    <string name="split">Split Action Items</string>
-    <string name="split_content">This activity is a demonstration of how split action items work. When you are concerned about the available room for items on small screens you should use this feature.</string>
-
-    <string name="split_action_modes">Split Action Modes</string>
-
-    <string name="static_attach">Static Attachment</string>
-    <string name="static_attach_content">This is a simple showcase of how easy it is to add the action bar to your activities without having to extend from a custom activity. Take a look at the source code, it\'s surprisingly simple!</string>
-
-    <string name="styled">Styled</string>
-    <string name="styled_content">This is a simple showcase of how to style the action bar to your liking. Be sure to remember that you need to consider both the custom and native action bar when styling. Looking at this activity\'s style is a good way to start.</string>
-
-    <string name="submenus">Sub-menus</string>
-    <string name="submenus_content">This activity is a demonstration of how sub-menus work when they are either an action item or an item in the overflow menu.</string>
-
-    <string name="tab_navigation">Tab Navigation</string>
-    <string name="tab_navigation_content">Tabs can be useful for switching between a limited number of items. You can also collapse the main body of the action bar on small devices so that only the tab bar is displayed. See the source for more information.</string>
-
-    <string name="tab_navigation_collapsed">Tab Navigation (Collapsed)</string>
-
-
-
-    <string name="action_bar_share_with">Share with...</string>
-
-
-
-    <string name="inline_preferences">In-line preferences</string>
-    <string name="dialog_based_preferences">Dialog-based preferences</string>
-    <string name="launch_preferences">Launch preferences</string>
-    <string name="preference_attributes">Preference attributes</string>
-
-    <string name="title_checkbox_preference">Checkbox preference</string>
-    <string name="summary_checkbox_preference">This is a checkbox</string>
-
-    <string name="title_edittext_preference">Edit text preference</string>
-    <string name="summary_edittext_preference">An example that uses an edit text dialog</string>
-    <string name="dialog_title_edittext_preference">Enter your favorite animal</string>
-
-    <string name="title_list_preference">List preference</string>
-    <string name="summary_list_preference">An example that uses a list dialog</string>
-    <string name="dialog_title_list_preference">Choose one</string>
-
-    <string name="title_intent_preference">Intent preference</string>
-    <string name="summary_intent_preference">Launches an Activity from an Intent</string>
-
-    <string name="title_my_preference">My preference</string>
-    <string name="summary_my_preference">This is a custom counter preference</string>
-
-    <string name="title_advanced_toggle_preference">Haunted preference</string>
-    <string name="summary_on_advanced_toggle_preference">I\'m on! :)</string>
-    <string name="summary_off_advanced_toggle_preference">I\'m off! :(</string>
-
-    <string name="title_parent_preference">Parent checkbox preference</string>
-    <string name="summary_parent_preference">This is visually a parent</string>
-    <string name="title_child_preference">Child checkbox preference</string>
-    <string name="summary_child_preference">This is visually a child</string>
-
-    <string name="example_preference_dependency">Example preference dependency</string>
-    <string name="title_wifi">WiFi</string>
-    <string name="title_wifi_settings">WiFi settings</string>
-
-    <string name="default_value_list_preference">beta</string>
-    <string name="default_value_edittext_preference">Default value</string>
-</resources>
diff --git a/samples/demos/res/values/themes.xml b/samples/demos/res/values/themes.xml
deleted file mode 100644
index 032bb48..0000000
--- a/samples/demos/res/values/themes.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <style name="Theme.Styled" parent="Theme.Sherlock.Light.DarkActionBar">
-        <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
-        <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
-    </style>
-    <style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
-        <item name="background">@drawable/bg_striped</item>
-        <item name="android:background">@drawable/bg_striped</item>
-        
-        <item name="backgroundSplit">@drawable/bg_striped_split</item>
-        <item name="android:backgroundSplit">@drawable/bg_striped_split</item>
-    </style>
-</resources>
diff --git a/samples/demos/res/xml/preferences.xml b/samples/demos/res/xml/preferences.xml
deleted file mode 100644
index 98084f3..0000000
--- a/samples/demos/res/xml/preferences.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- This is a primitive example showing the different types of preferences available. -->
-<PreferenceScreen
-        xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <PreferenceCategory
-            android:title="@string/inline_preferences">
-
-        <CheckBoxPreference
-                android:key="checkbox_preference"
-                android:title="@string/title_checkbox_preference"
-                android:summary="@string/summary_checkbox_preference" />
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-            android:title="@string/dialog_based_preferences">
-
-        <EditTextPreference
-                android:key="edittext_preference"
-                android:title="@string/title_edittext_preference"
-                android:summary="@string/summary_edittext_preference"
-                android:dialogTitle="@string/dialog_title_edittext_preference" />
-
-        <ListPreference
-                android:key="list_preference"
-                android:title="@string/title_list_preference"
-                android:summary="@string/summary_list_preference"
-                android:entries="@array/entries_list_preference"
-                android:entryValues="@array/entryvalues_list_preference"
-                android:dialogTitle="@string/dialog_title_list_preference" />
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-            android:title="@string/launch_preferences">
-
-        <PreferenceScreen
-                android:title="@string/title_intent_preference"
-                android:summary="@string/summary_intent_preference">
-
-            <intent android:action="android.intent.action.VIEW"
-                    android:data="http://www.android.com" />
-
-        </PreferenceScreen>
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-            android:title="@string/preference_attributes">
-
-        <CheckBoxPreference
-                android:key="parent_checkbox_preference"
-                android:title="@string/title_parent_preference"
-                android:summary="@string/summary_parent_preference" />
-
-        <!-- The visual style of a child is defined by this styled theme attribute. -->
-        <CheckBoxPreference
-                android:key="child_checkbox_preference"
-                android:dependency="parent_checkbox_preference"
-                android:layout="?android:attr/preferenceLayoutChild"
-                android:title="@string/title_child_preference"
-                android:summary="@string/summary_child_preference" />
-
-    </PreferenceCategory>
-
-</PreferenceScreen>
\ No newline at end of file
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionItems.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ActionItems.java
deleted file mode 100644
index 593a232..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionItems.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class ActionItems extends SherlockActivity {
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        //Used to put dark icons on light action bar
-        boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-        menu.add("Save")
-            .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Search")
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Refresh")
-            .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        return true;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        setContent((TextView)findViewById(R.id.text));
-    }
-
-    protected void setContent(TextView view) {
-        view.setText(R.string.action_items_content);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java
deleted file mode 100644
index 58a01e7..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-import android.widget.Toast;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.ActionMode;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class ActionModes extends SherlockActivity {
-    ActionMode mMode;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.action_modes);
-
-        ((Button)findViewById(R.id.start)).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mMode = startActionMode(new AnActionModeOfEpicProportions());
-            }
-        });
-        ((Button)findViewById(R.id.cancel)).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mMode != null) {
-                    mMode.finish();
-                }
-            }
-        });
-    }
-
-    private final class AnActionModeOfEpicProportions implements ActionMode.Callback {
-        @Override
-        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-            //Used to put dark icons on light action bar
-            boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-            menu.add("Save")
-                .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Search")
-                .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Refresh")
-                .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Save")
-                .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Search")
-                .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Refresh")
-                .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            return true;
-        }
-
-        @Override
-        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            return false;
-        }
-
-        @Override
-        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            Toast.makeText(ActionModes.this, "Got click: " + item, Toast.LENGTH_SHORT).show();
-            mode.finish();
-            return true;
-        }
-
-        @Override
-        public void onDestroyActionMode(ActionMode mode) {
-        }
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModesNoActionBar.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModesNoActionBar.java
deleted file mode 100644
index 23c7a3b..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModesNoActionBar.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-import android.widget.Toast;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.ActionMode;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.Window;
-
-public class ActionModesNoActionBar extends SherlockActivity {
-    ActionMode mMode;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-
-        //You could also use Theme.Sherlock.NoActionBar or Theme.Sherlock.Light.NoActionBar
-        requestWindowFeature(Window.FEATURE_NO_TITLE);
-
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.action_modes);
-
-        ((Button)findViewById(R.id.start)).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mMode = startActionMode(new AnActionModeOfEpicProportions());
-            }
-        });
-        ((Button)findViewById(R.id.cancel)).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mMode != null) {
-                    mMode.finish();
-                }
-            }
-        });
-    }
-
-    private final class AnActionModeOfEpicProportions implements ActionMode.Callback {
-        @Override
-        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-            //Used to put dark icons on light action bar
-            boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-            menu.add("Save")
-                .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Search")
-                .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Refresh")
-                .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Save")
-                .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Search")
-                .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            menu.add("Refresh")
-                .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-            return true;
-        }
-
-        @Override
-        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            return false;
-        }
-
-        @Override
-        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            Toast.makeText(ActionModesNoActionBar.this, "Got click: " + item, Toast.LENGTH_SHORT).show();
-            mode.finish();
-            return true;
-        }
-
-        @Override
-        public void onDestroyActionMode(ActionMode mode) {
-        }
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionProviders.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ActionProviders.java
deleted file mode 100644
index d7de2d8..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ActionProviders.java
+++ /dev/null
@@ -1,121 +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.actionbarsherlock.sample.demos;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.provider.Settings;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.ImageButton;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.ActionProvider;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-/**
- * 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 ActionProviders extends SherlockActivity {
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.action_providers_content);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
-        getSupportMenuInflater().inflate(R.menu.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, "Handling in onOptionsItemSelected avoided",
-                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.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;
-        }
-    }
-}
\ No newline at end of file
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/CollapsibleActionItem.java b/samples/demos/src/com/actionbarsherlock/sample/demos/CollapsibleActionItem.java
deleted file mode 100644
index 116545e..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/CollapsibleActionItem.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2012 Scott Kennedy
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class CollapsibleActionItem extends SherlockActivity {
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        //Used to put dark icons on light action bar
-        boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-        menu.add("Search")
-            .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-            .setActionView(R.layout.collapsible_edittext)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
-
-        return true;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.collapsible_content);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ContextMenus.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ContextMenus.java
deleted file mode 100644
index 3f08bfe..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ContextMenus.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.view.ContextMenu;
-import android.view.View;
-import android.widget.Toast;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class ContextMenus extends SherlockActivity {
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        //Used to put dark icons on light action bar
-        boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-        menu.add("Save")
-            .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Search")
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Refresh")
-            .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        //This uses the imported MenuItem from ActionBarSherlock
-        Toast.makeText(this, "Got click: " + item.toString(), Toast.LENGTH_SHORT).show();
-        return true;
-    }
-
-    @Override
-    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
-        menu.add("One");
-        menu.add("Two");
-        menu.add("Three");
-        menu.add("Four");
-    }
-
-    @Override
-    public boolean onContextItemSelected(android.view.MenuItem item) {
-        //Note how this callback is using the fully-qualified class name
-        Toast.makeText(this, "Got click: " + item.toString(), Toast.LENGTH_SHORT).show();
-        return true;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.context_menus);
-        registerForContextMenu(findViewById(R.id.show_context_menu));
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/CustomNavigation.java b/samples/demos/src/com/actionbarsherlock/sample/demos/CustomNavigation.java
deleted file mode 100644
index f9696fc..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/CustomNavigation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.RadioGroup;
-import android.widget.Toast;
-import android.widget.RadioGroup.OnCheckedChangeListener;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.SherlockActivity;
-
-public class CustomNavigation extends SherlockActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.custom_navigation_content);
-
-        //Inflate the custom view
-        View customNav = LayoutInflater.from(this).inflate(R.layout.custom_view, null);
-
-        //Bind to its state change
-        ((RadioGroup)customNav.findViewById(R.id.radio_nav)).setOnCheckedChangeListener(new OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(RadioGroup group, int checkedId) {
-                Toast.makeText(CustomNavigation.this, "Navigation selection changed.", Toast.LENGTH_SHORT).show();
-            }
-        });
-
-        //Attach to the action bar
-        getSupportActionBar().setCustomView(customNav);
-        getSupportActionBar().setDisplayShowCustomEnabled(true);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/Dialog.java b/samples/demos/src/com/actionbarsherlock/sample/demos/Dialog.java
deleted file mode 100644
index a9dbaeb..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/Dialog.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockActivity;
-
-public class Dialog extends SherlockActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.dialog_content);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/FeatureToggles.java b/samples/demos/src/com/actionbarsherlock/sample/demos/FeatureToggles.java
deleted file mode 100644
index c9b99b9..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/FeatureToggles.java
+++ /dev/null
@@ -1,271 +0,0 @@
-package com.actionbarsherlock.sample.demos;
-
-import java.util.Random;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.view.View;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.ActionBar.Tab;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.Window;
-
-public class FeatureToggles extends SherlockActivity implements ActionBar.TabListener {
-    private static final Random RANDOM = new Random();
-
-    private int items = 0;
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        for (int i = 0; i < items; i++) {
-            menu.add("Text")
-                .setIcon(R.drawable.ic_title_share_default)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-        }
-
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.feature_toggles);
-        setSupportProgressBarIndeterminateVisibility(false);
-        setSupportProgressBarVisibility(false);
-
-        getSupportActionBar().setCustomView(R.layout.custom_view);
-        getSupportActionBar().setDisplayShowCustomEnabled(false);
-
-        Context context = getSupportActionBar().getThemedContext();
-        ArrayAdapter<CharSequence> listAdapter = ArrayAdapter.createFromResource(context, R.array.locations, R.layout.sherlock_spinner_item);
-        listAdapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
-
-        getSupportActionBar().setListNavigationCallbacks(listAdapter, null);
-
-        findViewById(R.id.display_progress_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setSupportProgressBarVisibility(true);
-                setSupportProgressBarIndeterminateVisibility(false);
-                setSupportProgress(RANDOM.nextInt(8000) + 10);
-            }
-        });
-        findViewById(R.id.display_progress_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setSupportProgressBarVisibility(false);
-            }
-        });
-        findViewById(R.id.display_iprogress_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                //Hack to hide the regular progress bar
-                setSupportProgress(Window.PROGRESS_END);
-                setSupportProgressBarIndeterminateVisibility(true);
-            }
-        });
-        findViewById(R.id.display_iprogress_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                setSupportProgressBarIndeterminateVisibility(false);
-            }
-        });
-
-        findViewById(R.id.display_items_clear).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                items = 0;
-                invalidateOptionsMenu();
-            }
-        });
-        findViewById(R.id.display_items_add).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                items += 1;
-                invalidateOptionsMenu();
-            }
-        });
-
-        findViewById(R.id.display_subtitle_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setSubtitle("The quick brown fox jumps over the lazy dog.");
-            }
-        });
-        findViewById(R.id.display_subtitle_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setSubtitle(null);
-            }
-        });
-
-        findViewById(R.id.display_title_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayShowTitleEnabled(true);
-            }
-        });
-        findViewById(R.id.display_title_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayShowTitleEnabled(false);
-            }
-        });
-
-        findViewById(R.id.display_custom_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayShowCustomEnabled(true);
-            }
-        });
-        findViewById(R.id.display_custom_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayShowCustomEnabled(false);
-            }
-        });
-
-        findViewById(R.id.navigation_standard).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
-            }
-        });
-        findViewById(R.id.navigation_list).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
-            }
-        });
-        findViewById(R.id.navigation_tabs).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-            }
-        });
-
-        findViewById(R.id.display_home_as_up_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
-            }
-        });
-        findViewById(R.id.display_home_as_up_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
-            }
-        });
-
-        findViewById(R.id.display_logo_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayUseLogoEnabled(true);
-            }
-        });
-        findViewById(R.id.display_logo_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayUseLogoEnabled(false);
-            }
-        });
-
-        findViewById(R.id.display_home_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayShowHomeEnabled(true);
-            }
-        });
-        findViewById(R.id.display_home_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().setDisplayShowHomeEnabled(false);
-            }
-        });
-
-        findViewById(R.id.display_actionbar_show).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().show();
-            }
-        });
-        findViewById(R.id.display_actionbar_hide).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().hide();
-            }
-        });
-
-        Button tabAdd = (Button)findViewById(R.id.display_tab_add);
-        tabAdd.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                ActionBar.Tab newTab = getSupportActionBar().newTab();
-
-                if (RANDOM.nextBoolean()) {
-                    newTab.setCustomView(R.layout.tab_custom_view);
-                } else {
-                    boolean icon = RANDOM.nextBoolean();
-                    if (icon) {
-                        newTab.setIcon(R.drawable.ic_title_share_default);
-                    }
-                    if (!icon || RANDOM.nextBoolean()) {
-                        newTab.setText("Text!");
-                    }
-                }
-                newTab.setTabListener(FeatureToggles.this);
-                getSupportActionBar().addTab(newTab);
-            }
-        });
-        //Add some tabs
-        tabAdd.performClick();
-        tabAdd.performClick();
-        tabAdd.performClick();
-
-        findViewById(R.id.display_tab_select).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (getSupportActionBar().getTabCount() > 0) {
-                    getSupportActionBar().selectTab(
-                            getSupportActionBar().getTabAt(
-                                    RANDOM.nextInt(getSupportActionBar().getTabCount())
-                            )
-                    );
-                }
-            }
-        });
-        findViewById(R.id.display_tab_remove).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                if (getSupportActionBar().getTabCount() > 0) {
-                    getSupportActionBar().removeTabAt(getSupportActionBar().getTabCount() - 1);
-                }
-            }
-        });
-        findViewById(R.id.display_tab_remove_all).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                getSupportActionBar().removeAllTabs();
-            }
-        });
-    }
-
-    @Override
-    public void onTabSelected(Tab tab, FragmentTransaction transaction) {}
-
-    @Override
-    public void onTabUnselected(Tab tab, FragmentTransaction transaction) {}
-
-    @Override
-    public void onTabReselected(Tab tab, FragmentTransaction transaction) {}
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ForcedOverflowItem.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ForcedOverflowItem.java
deleted file mode 100644
index 3c8e3f1..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ForcedOverflowItem.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class ForcedOverflowItem extends SherlockActivity {
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        //Used to put dark icons on light action bar
-        boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-        menu.add("Save")
-            .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Search")
-            .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Refresh")
-            .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Save")
-            .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Search")
-            .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        menu.add("Refresh")
-            .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-
-        return true;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        //Used for theme switching in samples
-        int theme = R.style.Theme_Sherlock_ForceOverflow;
-        if (SampleList.THEME == R.style.Theme_Sherlock_Light) {
-            theme = R.style.Theme_Sherlock_Light_ForceOverflow;
-        } else if (SampleList.THEME == R.style.Theme_Sherlock_Light_DarkActionBar) {
-            theme = R.style.Theme_Sherlock_Light_DarkActionBar_ForceOverflow;
-        }
-        setTheme(theme);
-
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.forced_overflow_content);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/IndeterminateProgress.java b/samples/demos/src/com/actionbarsherlock/sample/demos/IndeterminateProgress.java
deleted file mode 100644
index 5d10d28..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/IndeterminateProgress.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.view.View;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Window;
-
-public class IndeterminateProgress extends SherlockActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        //This has to be called before setContentView and you must use the
-        //class in com.actionbarsherlock.view and NOT android.view
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-
-        setContentView(R.layout.iprogress);
-
-        findViewById(R.id.enable).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View arg0) {
-                setSupportProgressBarIndeterminateVisibility(true);
-            }
-        });
-        findViewById(R.id.disable).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View arg0) {
-                setSupportProgressBarIndeterminateVisibility(false);
-            }
-        });
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ListNavigation.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ListNavigation.java
deleted file mode 100644
index e529de3..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ListNavigation.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.actionbarsherlock.sample.demos;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.widget.ArrayAdapter;
-import android.widget.TextView;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockActivity;
-
-public class ListNavigation extends SherlockActivity implements ActionBar.OnNavigationListener {
-    private TextView mSelected;
-    private String[] mLocations;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.list_navigation);
-        mSelected = (TextView)findViewById(R.id.text);
-
-        mLocations = getResources().getStringArray(R.array.locations);
-
-        Context context = getSupportActionBar().getThemedContext();
-        ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context, R.array.locations, R.layout.sherlock_spinner_item);
-        list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
-
-        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
-        getSupportActionBar().setListNavigationCallbacks(list, this);
-    }
-
-    @Override
-    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
-        mSelected.setText("Selected: " + mLocations[itemPosition]);
-        return true;
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/Overlay.java b/samples/demos/src/com/actionbarsherlock/sample/demos/Overlay.java
deleted file mode 100644
index 4bb37ea..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/Overlay.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Window;
-
-public class Overlay extends SherlockActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.overlay);
-
-        //Load partially transparent black background
-        getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.ab_bg_black));
-
-        StringBuilder builder = new StringBuilder();
-        for (int i = 0; i < 3; i++) {
-            for (String dialog : DIALOGUE) {
-                  builder.append(dialog).append("\n\n");
-            }
-        }
-
-        TextView bunchOfText = (TextView)findViewById(R.id.bunch_of_text);
-        bunchOfText.setText(builder.toString());
-    }
-
-    public static final String[] DIALOGUE = new String[] {
-            "So shaken as we are, so wan with care," +
-            "Find we a time for frighted peace to pant," +
-            "And breathe short-winded accents of new broils" +
-            "To be commenced in strands afar remote." +
-            "No more the thirsty entrance of this soil" +
-            "Shall daub her lips with her own children's blood;" +
-            "Nor more shall trenching war channel her fields," +
-            "Nor bruise her flowerets with the armed hoofs" +
-            "Of hostile paces: those opposed eyes," +
-            "Which, like the meteors of a troubled heaven," +
-            "All of one nature, of one substance bred," +
-            "Did lately meet in the intestine shock" +
-            "And furious close of civil butchery" +
-            "Shall now, in mutual well-beseeming ranks," +
-            "March all one way and be no more opposed" +
-            "Against acquaintance, kindred and allies:" +
-            "The edge of war, like an ill-sheathed knife," +
-            "No more shall cut his master. Therefore, friends," +
-            "As far as to the sepulchre of Christ," +
-            "Whose soldier now, under whose blessed cross" +
-            "We are impressed and engaged to fight," +
-            "Forthwith a power of English shall we levy;" +
-            "Whose arms were moulded in their mothers' womb" +
-            "To chase these pagans in those holy fields" +
-            "Over whose acres walk'd those blessed feet" +
-            "Which fourteen hundred years ago were nail'd" +
-            "For our advantage on the bitter cross." +
-            "But this our purpose now is twelve month old," +
-            "And bootless 'tis to tell you we will go:" +
-            "Therefore we meet not now. Then let me hear" +
-            "Of you, my gentle cousin Westmoreland," +
-            "What yesternight our council did decree" +
-            "In forwarding this dear expedience.",
-
-            "Hear him but reason in divinity," +
-            "And all-admiring with an inward wish" +
-            "You would desire the king were made a prelate:" +
-            "Hear him debate of commonwealth affairs," +
-            "You would say it hath been all in all his study:" +
-            "List his discourse of war, and you shall hear" +
-            "A fearful battle render'd you in music:" +
-            "Turn him to any cause of policy," +
-            "The Gordian knot of it he will unloose," +
-            "Familiar as his garter: that, when he speaks," +
-            "The air, a charter'd libertine, is still," +
-            "And the mute wonder lurketh in men's ears," +
-            "To steal his sweet and honey'd sentences;" +
-            "So that the art and practic part of life" +
-            "Must be the mistress to this theoric:" +
-            "Which is a wonder how his grace should glean it," +
-            "Since his addiction was to courses vain," +
-            "His companies unletter'd, rude and shallow," +
-            "His hours fill'd up with riots, banquets, sports," +
-            "And never noted in him any study," +
-            "Any retirement, any sequestration" +
-            "From open haunts and popularity.",
-
-            "I come no more to make you laugh: things now," +
-            "That bear a weighty and a serious brow," +
-            "Sad, high, and working, full of state and woe," +
-            "Such noble scenes as draw the eye to flow," +
-            "We now present. Those that can pity, here" +
-            "May, if they think it well, let fall a tear;" +
-            "The subject will deserve it. Such as give" +
-            "Their money out of hope they may believe," +
-            "May here find truth too. Those that come to see" +
-            "Only a show or two, and so agree" +
-            "The play may pass, if they be still and willing," +
-            "I'll undertake may see away their shilling" +
-            "Richly in two short hours. Only they" +
-            "That come to hear a merry bawdy play," +
-            "A noise of targets, or to see a fellow" +
-            "In a long motley coat guarded with yellow," +
-            "Will be deceived; for, gentle hearers, know," +
-            "To rank our chosen truth with such a show" +
-            "As fool and fight is, beside forfeiting" +
-            "Our own brains, and the opinion that we bring," +
-            "To make that only true we now intend," +
-            "Will leave us never an understanding friend." +
-            "Therefore, for goodness' sake, and as you are known" +
-            "The first and happiest hearers of the town," +
-            "Be sad, as we would make ye: think ye see" +
-            "The very persons of our noble story" +
-            "As they were living; think you see them great," +
-            "And follow'd with the general throng and sweat" +
-            "Of thousand friends; then in a moment, see" +
-            "How soon this mightiness meets misery:" +
-            "And, if you can be merry then, I'll say" +
-            "A man may weep upon his wedding-day.",
-
-            "First, heaven be the record to my speech!" +
-            "In the devotion of a subject's love," +
-            "Tendering the precious safety of my prince," +
-            "And free from other misbegotten hate," +
-            "Come I appellant to this princely presence." +
-            "Now, Thomas Mowbray, do I turn to thee," +
-            "And mark my greeting well; for what I speak" +
-            "My body shall make good upon this earth," +
-            "Or my divine soul answer it in heaven." +
-            "Thou art a traitor and a miscreant," +
-            "Too good to be so and too bad to live," +
-            "Since the more fair and crystal is the sky," +
-            "The uglier seem the clouds that in it fly." +
-            "Once more, the more to aggravate the note," +
-            "With a foul traitor's name stuff I thy throat;" +
-            "And wish, so please my sovereign, ere I move," +
-            "What my tongue speaks my right drawn sword may prove.",
-
-            "Now is the winter of our discontent" +
-            "Made glorious summer by this sun of York;" +
-            "And all the clouds that lour'd upon our house" +
-            "In the deep bosom of the ocean buried." +
-            "Now are our brows bound with victorious wreaths;" +
-            "Our bruised arms hung up for monuments;" +
-            "Our stern alarums changed to merry meetings," +
-            "Our dreadful marches to delightful measures." +
-            "Grim-visaged war hath smooth'd his wrinkled front;" +
-            "And now, instead of mounting barded steeds" +
-            "To fright the souls of fearful adversaries," +
-            "He capers nimbly in a lady's chamber" +
-            "To the lascivious pleasing of a lute." +
-            "But I, that am not shaped for sportive tricks," +
-            "Nor made to court an amorous looking-glass;" +
-            "I, that am rudely stamp'd, and want love's majesty" +
-            "To strut before a wanton ambling nymph;" +
-            "I, that am curtail'd of this fair proportion," +
-            "Cheated of feature by dissembling nature," +
-            "Deformed, unfinish'd, sent before my time" +
-            "Into this breathing world, scarce half made up," +
-            "And that so lamely and unfashionable" +
-            "That dogs bark at me as I halt by them;" +
-            "Why, I, in this weak piping time of peace," +
-            "Have no delight to pass away the time," +
-            "Unless to spy my shadow in the sun" +
-            "And descant on mine own deformity:" +
-            "And therefore, since I cannot prove a lover," +
-            "To entertain these fair well-spoken days," +
-            "I am determined to prove a villain" +
-            "And hate the idle pleasures of these days." +
-            "Plots have I laid, inductions dangerous," +
-            "By drunken prophecies, libels and dreams," +
-            "To set my brother Clarence and the king" +
-            "In deadly hate the one against the other:" +
-            "And if King Edward be as true and just" +
-            "As I am subtle, false and treacherous," +
-            "This day should Clarence closely be mew'd up," +
-            "About a prophecy, which says that 'G'" +
-            "Of Edward's heirs the murderer shall be." +
-            "Dive, thoughts, down to my soul: here" +
-            "Clarence comes.",
-
-            "To bait fish withal: if it will feed nothing else," +
-            "it will feed my revenge. He hath disgraced me, and" +
-            "hindered me half a million; laughed at my losses," +
-            "mocked at my gains, scorned my nation, thwarted my" +
-            "bargains, cooled my friends, heated mine" +
-            "enemies; and what's his reason? I am a Jew. Hath" +
-            "not a Jew eyes? hath not a Jew hands, organs," +
-            "dimensions, senses, affections, passions? fed with" +
-            "the same food, hurt with the same weapons, subject" +
-            "to the same diseases, healed by the same means," +
-            "warmed and cooled by the same winter and summer, as" +
-            "a Christian is? If you prick us, do we not bleed?" +
-            "if you tickle us, do we not laugh? if you poison" +
-            "us, do we not die? and if you wrong us, shall we not" +
-            "revenge? If we are like you in the rest, we will" +
-            "resemble you in that. If a Jew wrong a Christian," +
-            "what is his humility? Revenge. If a Christian" +
-            "wrong a Jew, what should his sufferance be by" +
-            "Christian example? Why, revenge. The villany you" +
-            "teach me, I will execute, and it shall go hard but I" +
-            "will better the instruction.",
-
-            "Virtue! a fig! 'tis in ourselves that we are thus" +
-            "or thus. Our bodies are our gardens, to the which" +
-            "our wills are gardeners: so that if we will plant" +
-            "nettles, or sow lettuce, set hyssop and weed up" +
-            "thyme, supply it with one gender of herbs, or" +
-            "distract it with many, either to have it sterile" +
-            "with idleness, or manured with industry, why, the" +
-            "power and corrigible authority of this lies in our" +
-            "wills. If the balance of our lives had not one" +
-            "scale of reason to poise another of sensuality, the" +
-            "blood and baseness of our natures would conduct us" +
-            "to most preposterous conclusions: but we have" +
-            "reason to cool our raging motions, our carnal" +
-            "stings, our unbitted lusts, whereof I take this that" +
-            "you call love to be a sect or scion.",
-
-            "Blow, winds, and crack your cheeks! rage! blow!" +
-            "You cataracts and hurricanoes, spout" +
-            "Till you have drench'd our steeples, drown'd the cocks!" +
-            "You sulphurous and thought-executing fires," +
-            "Vaunt-couriers to oak-cleaving thunderbolts," +
-            "Singe my white head! And thou, all-shaking thunder," +
-            "Smite flat the thick rotundity o' the world!" +
-            "Crack nature's moulds, an germens spill at once," +
-            "That make ingrateful man!"
-    };
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/Preference.java b/samples/demos/src/com/actionbarsherlock/sample/demos/Preference.java
deleted file mode 100644
index 27cfc7d..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/Preference.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import com.actionbarsherlock.app.SherlockPreferenceActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class Preference extends SherlockPreferenceActivity {
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        //Used to put dark icons on light action bar
-        boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-        menu.add("Save")
-            .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Search")
-            .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Refresh")
-            .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        addPreferencesFromResource(R.xml.preferences);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/Progress.java b/samples/demos/src/com/actionbarsherlock/sample/demos/Progress.java
deleted file mode 100644
index f6b4b88..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/Progress.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.View;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Window;
-
-public class Progress extends SherlockActivity  {
-    Handler mHandler = new Handler();
-    Runnable mProgressRunner = new Runnable() {
-        @Override
-        public void run() {
-            mProgress += 2;
-
-            //Normalize our progress along the progress bar's scale
-            int progress = (Window.PROGRESS_END - Window.PROGRESS_START) / 100 * mProgress;
-            setSupportProgress(progress);
-
-            if (mProgress < 100) {
-                mHandler.postDelayed(mProgressRunner, 50);
-            }
-        }
-    };
-
-    private int mProgress = 100;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        //This has to be called before setContentView and you must use the
-        //class in com.actionbarsherlock.view and NOT android.view
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-
-        setContentView(R.layout.progress);
-
-        findViewById(R.id.go).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View arg0) {
-                if (mProgress == 100) {
-                    mProgress = 0;
-                    mProgressRunner.run();
-                }
-            }
-        });
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/SampleList.java b/samples/demos/src/com/actionbarsherlock/sample/demos/SampleList.java
deleted file mode 100644
index 38ef4c0..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/SampleList.java
+++ /dev/null
@@ -1,175 +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.actionbarsherlock.sample.demos;
-
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.SimpleAdapter;
-import android.widget.Toast;
-
-import com.actionbarsherlock.app.SherlockListActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.SubMenu;
-
-public class SampleList extends SherlockListActivity {
-    public static int THEME = R.style.Theme_Sherlock;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        Intent intent = getIntent();
-        String path = intent.getStringExtra("com.example.android.apis.Path");
-
-        if (path == null) {
-            path = "";
-        }
-
-        setListAdapter(new SimpleAdapter(this, getData(path),
-                android.R.layout.simple_list_item_1, new String[] { "title" },
-                new int[] { android.R.id.text1 }));
-        getListView().setTextFilterEnabled(true);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        SubMenu sub = menu.addSubMenu("Theme");
-        sub.add(0, R.style.Theme_Sherlock, 0, "Default");
-        sub.add(0, R.style.Theme_Sherlock_Light, 0, "Light");
-        sub.add(0, R.style.Theme_Sherlock_Light_DarkActionBar, 0, "Light (Dark Action Bar)");
-        sub.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() == android.R.id.home || item.getItemId() == 0) {
-            return false;
-        }
-        THEME = item.getItemId();
-        Toast.makeText(this, "Theme changed to \"" + item.getTitle() + "\"", Toast.LENGTH_SHORT).show();
-        return true;
-    }
-
-    protected List<Map<String, Object>> getData(String prefix) {
-        List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>();
-
-        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-        mainIntent.addCategory("com.actionbarsherlock.sample.demos.EXAMPLE");
-
-        PackageManager pm = getPackageManager();
-        List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
-
-        if (null == list)
-            return myData;
-
-        String[] prefixPath;
-        String prefixWithSlash = prefix;
-
-        if (prefix.equals("")) {
-            prefixPath = null;
-        } else {
-            prefixPath = prefix.split("/");
-            prefixWithSlash = prefix + "/";
-        }
-
-        int len = list.size();
-
-        Map<String, Boolean> entries = new HashMap<String, Boolean>();
-
-        for (int i = 0; i < len; i++) {
-            ResolveInfo info = list.get(i);
-            CharSequence labelSeq = info.loadLabel(pm);
-            String label = labelSeq != null
-                    ? labelSeq.toString()
-                    : info.activityInfo.name;
-
-            if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) {
-
-                String[] labelPath = label.split("/");
-
-                String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length];
-
-                if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) {
-                    addItem(myData, nextLabel, activityIntent(
-                            info.activityInfo.applicationInfo.packageName,
-                            info.activityInfo.name));
-                } else {
-                    if (entries.get(nextLabel) == null) {
-                        addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel));
-                        entries.put(nextLabel, true);
-                    }
-                }
-            }
-        }
-
-        Collections.sort(myData, sDisplayNameComparator);
-
-        return myData;
-    }
-
-    private final static Comparator<Map<String, Object>> sDisplayNameComparator =
-        new Comparator<Map<String, Object>>() {
-        private final Collator   collator = Collator.getInstance();
-
-        public int compare(Map<String, Object> map1, Map<String, Object> map2) {
-            return collator.compare(map1.get("title"), map2.get("title"));
-        }
-    };
-
-    protected Intent activityIntent(String pkg, String componentName) {
-        Intent result = new Intent();
-        result.setClassName(pkg, componentName);
-        return result;
-    }
-
-    protected Intent browseIntent(String path) {
-        Intent result = new Intent();
-        result.setClass(this, SampleList.class);
-        result.putExtra("com.example.android.apis.Path", path);
-        return result;
-    }
-
-    protected void addItem(List<Map<String, Object>> data, String name, Intent intent) {
-        Map<String, Object> temp = new HashMap<String, Object>();
-        temp.put("title", name);
-        temp.put("intent", intent);
-        data.add(temp);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);
-
-        Intent intent = (Intent) map.get("intent");
-        startActivity(intent);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/ShareActionProviders.java b/samples/demos/src/com/actionbarsherlock/sample/demos/ShareActionProviders.java
deleted file mode 100644
index 5b7ece2..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/ShareActionProviders.java
+++ /dev/null
@@ -1,129 +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.actionbarsherlock.sample.demos;
-
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.widget.ShareActionProvider;
-
-/**
- * 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 ShareActionProviders extends SherlockActivity {
-
-    private static final String SHARED_FILE_NAME = "shared.png";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.share_action_providers_content);
-        copyPrivateRawResuorceToPubliclyAccessibleFile();
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        // Inflate your menu.
-        getSupportMenuInflater().inflate(R.menu.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());
-
-        //XXX: For now, ShareActionProviders must be displayed on the action bar
-        // 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 */
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/Simple.java b/samples/demos/src/com/actionbarsherlock/sample/demos/Simple.java
deleted file mode 100644
index a5eb843..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/Simple.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.SherlockActivity;
-
-public class Simple extends SherlockActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.simple_content);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/SplitActionItems.java b/samples/demos/src/com/actionbarsherlock/sample/demos/SplitActionItems.java
deleted file mode 100644
index d155870..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/SplitActionItems.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.widget.TextView;
-
-//We're the same! Manifest and content text changes only.
-public class SplitActionItems extends ActionItems {
-    @Override
-    public void setContent(TextView view) {
-        view.setText(R.string.split_content);
-    }
-}
\ No newline at end of file
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/SplitActionModes.java b/samples/demos/src/com/actionbarsherlock/sample/demos/SplitActionModes.java
deleted file mode 100644
index e1d7850..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/SplitActionModes.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-//We're the same! Manifest changes only.
-public class SplitActionModes extends ActionModes {}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/StaticAttachment.java b/samples/demos/src/com/actionbarsherlock/sample/demos/StaticAttachment.java
deleted file mode 100644
index b48bf85..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/StaticAttachment.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import com.actionbarsherlock.ActionBarSherlock;
-import com.actionbarsherlock.ActionBarSherlock.OnCreateOptionsMenuListener;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import android.app.Activity;
-import android.content.pm.ActivityInfo;
-import android.os.Bundle;
-import android.widget.TextView;
-
-public class StaticAttachment extends Activity implements OnCreateOptionsMenuListener {
-    ActionBarSherlock mSherlock = ActionBarSherlock.wrap(this);
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        /*
-         * Most interactions with what would otherwise be the system UI should
-         * now be done through this instance. Content, title, action bar, and
-         * menu inflation can all be done.
-         *
-         * All of the base activities use this class to provide the normal
-         * action bar functionality so everything that they can do is possible
-         * using this static attachment method.
-         *
-         * Calling something like setContentView or getActionBar on this
-         * instance is required in order to properly set up the wrapped layout
-         * and dispatch menu events (if they are needed).
-         */
-        mSherlock.setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
-        mSherlock.setContentView(R.layout.text);
-
-        ((TextView)findViewById(R.id.text)).setText(R.string.static_attach_content);
-    }
-
-    /*
-     * In order to use action items properly with static attachment you
-     * need to dispatch create, prepare, and selected events for the
-     * native type to the ActionBarSherlock instance. If for some reason
-     * you need to use static attachment you should probably create a
-     * common base activity that does this for all three methods.
-     */
-    @Override
-    public boolean onCreateOptionsMenu(android.view.Menu menu) {
-        return mSherlock.dispatchCreateOptionsMenu(menu);
-    }
-
-    /*
-     * In order to receive these events you need to implement an interface
-     * from ActionBarSherlock so it knows to dispatch to this callback.
-     * There are three possible interface you can implement, one for each
-     * menu event.
-     *
-     * Remember, there are no superclass implementations of these methods so
-     * you must return a value with meaning.
-     */
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        //Used to put dark icons on light action bar
-        boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
-
-        menu.add("Save")
-            .setIcon(isLight ? R.drawable.ic_compose_inverse : R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Search")
-            .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Refresh")
-            .setIcon(isLight ? R.drawable.ic_refresh_inverse : R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        return true;
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/Styled.java b/samples/demos/src/com/actionbarsherlock/sample/demos/Styled.java
deleted file mode 100644
index 4655e20..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/Styled.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.BitmapDrawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-public class Styled extends SherlockActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.styled_content);
-
-        //This is a workaround for http://b.android.com/15340 from http://stackoverflow.com/a/5852198/132047
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-            BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.bg_striped);
-            bg.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
-            getSupportActionBar().setBackgroundDrawable(bg);
-
-            BitmapDrawable bgSplit = (BitmapDrawable)getResources().getDrawable(R.drawable.bg_striped_split_img);
-            bgSplit.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
-            getSupportActionBar().setSplitBackgroundDrawable(bgSplit);
-        }
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        menu.add("Save")
-            .setIcon(R.drawable.ic_compose)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Search")
-            .setIcon(R.drawable.ic_search)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        menu.add("Refresh")
-            .setIcon(R.drawable.ic_refresh)
-            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        return super.onCreateOptionsMenu(menu);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/SubMenus.java b/samples/demos/src/com/actionbarsherlock/sample/demos/SubMenus.java
deleted file mode 100644
index 33e65a5..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/SubMenus.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 Jake Wharton
- *
- * 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.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.SubMenu;
-
-public class SubMenus extends SherlockActivity {
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-
-        SubMenu subMenu1 = menu.addSubMenu("Action Item");
-        subMenu1.add("Sample");
-        subMenu1.add("Menu");
-        subMenu1.add("Items");
-
-        MenuItem subMenu1Item = subMenu1.getItem();
-        subMenu1Item.setIcon(R.drawable.ic_title_share_default);
-        subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-
-        SubMenu subMenu2 = menu.addSubMenu("Overflow Item");
-        subMenu2.add("These");
-        subMenu2.add("Are");
-        subMenu2.add("Sample");
-        subMenu2.add("Items");
-
-        MenuItem subMenu2Item = subMenu2.getItem();
-        subMenu2Item.setIcon(R.drawable.ic_compose);
-
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text);
-        ((TextView)findViewById(R.id.text)).setText(R.string.submenus_content);
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/TabNavigation.java b/samples/demos/src/com/actionbarsherlock/sample/demos/TabNavigation.java
deleted file mode 100644
index 19bc031..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/TabNavigation.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.widget.TextView;
-
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.ActionBar.Tab;
-import com.actionbarsherlock.app.SherlockActivity;
-
-public class TabNavigation extends SherlockActivity implements ActionBar.TabListener {
-    private TextView mSelected;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.tab_navigation);
-        mSelected = (TextView)findViewById(R.id.text);
-
-        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-        for (int i = 1; i <= 3; i++) {
-            ActionBar.Tab tab = getSupportActionBar().newTab();
-            tab.setText("Tab " + i);
-            tab.setTabListener(this);
-            getSupportActionBar().addTab(tab);
-        }
-    }
-
-    @Override
-    public void onTabReselected(Tab tab, FragmentTransaction transaction) {
-    }
-
-    @Override
-    public void onTabSelected(Tab tab, FragmentTransaction transaction) {
-        mSelected.setText("Selected: " + tab.getText());
-    }
-
-    @Override
-    public void onTabUnselected(Tab tab, FragmentTransaction transaction) {
-    }
-}
diff --git a/samples/demos/src/com/actionbarsherlock/sample/demos/TabNavigationCollapsed.java b/samples/demos/src/com/actionbarsherlock/sample/demos/TabNavigationCollapsed.java
deleted file mode 100644
index 033d2f5..0000000
--- a/samples/demos/src/com/actionbarsherlock/sample/demos/TabNavigationCollapsed.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.actionbarsherlock.sample.demos;
-
-import android.os.Bundle;
-
-public class TabNavigationCollapsed extends TabNavigation {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        //The following two options trigger the collapsing of the main action bar view.
-        //See the parent activity for the rest of the implementation
-        getSupportActionBar().setDisplayShowHomeEnabled(false);
-        getSupportActionBar().setDisplayShowTitleEnabled(false);
-    }
-}
diff --git a/samples/fragments/AndroidManifest.xml b/samples/fragments/AndroidManifest.xml
deleted file mode 100644
index 57e593d..0000000
--- a/samples/fragments/AndroidManifest.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
---><!-- Declare the contents of this Android application.  The namespace
-     attribute brings in the Android platform namespace, and the package
-     supplies a unique name for the application.  When writing your
-     own application, the package name must be changed from "com.example.*"
-     to come from a domain that you own or have control over. --><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="90" android:versionName="4.1.0" package="com.actionbarsherlock.sample.fragments">
-
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15"/>
-
-    <uses-permission android:name="android.permission.READ_CONTACTS"/>
-
-    <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
-
-    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/application_name">
-
-        <activity android:label="@string/activity_sample_code" android:name=".SampleList" android:theme="@style/Theme.Sherlock">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:name=".SendResult"/>
-
-        <!-- Fragment Support Samples -->
-
-        <activity android:label="@string/fragment_alert_dialog_support" android:name=".FragmentAlertDialogSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_arguments_support" android:name=".FragmentArgumentsSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_custom_animation_support" android:name=".FragmentCustomAnimationSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_hide_show_support" android:name=".FragmentHideShowSupport" android:windowSoftInputMode="stateUnchanged">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_context_menu_support" android:name=".FragmentContextMenuSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_dialog_support" android:name=".FragmentDialogSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_dialog_or_activity_support" android:name=".FragmentDialogOrActivitySupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_layout_support" android:name=".FragmentLayoutSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_list_array_support" android:name=".FragmentListArraySupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:name=".FragmentLayoutSupport$DetailsActivity"/>
-
-        <activity android:label="@string/fragment_menu_support" android:name=".FragmentMenuSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_retain_instance_support" android:name=".FragmentRetainInstanceSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_receive_result_support" android:name=".FragmentReceiveResultSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_stack_support" android:name=".FragmentStackSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_tabs" android:name=".FragmentTabs">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_tabs_pager" android:name=".FragmentTabsPager">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_pager_support" android:name=".FragmentPagerSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:label="@string/fragment_state_pager_support" android:name=".FragmentStatePagerSupport">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.fragments.EXAMPLE"/>
-            </intent-filter>
-        </activity>
-
-        <provider android:authorities="com.example.android.apis.supportv4.app.LoaderThrottle" android:name=".LoaderThrottleSupport$SimpleProvider"/>
-    </application>
-</manifest>
diff --git a/samples/fragments/README.md b/samples/fragments/README.md
deleted file mode 100644
index a0198bf..0000000
--- a/samples/fragments/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-ActionBarSherlock Sample: Demos
-===============================
-
-See [actionbarsherlock.com/samples.html][1] for information on the sample
-contained in this folder.
-
-
-
-
-
-
-
- [1]: http://actionbarsherlock.com/samples.html
diff --git a/samples/fragments/libs/android-support-v4.jar b/samples/fragments/libs/android-support-v4.jar
deleted file mode 100644
index 99e063b..0000000
--- a/samples/fragments/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/pom.xml b/samples/fragments/pom.xml
deleted file mode 100644
index 749f46f..0000000
--- a/samples/fragments/pom.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.actionbarsherlock</groupId>
-	<artifactId>sample-fragments</artifactId>
-	<name>Sample: Fragments</name>
-	<packaging>apk</packaging>
-
-	<parent>
-		<groupId>com.actionbarsherlock</groupId>
-		<artifactId>parent-sample</artifactId>
-		<version>4.1.0</version>
-		<relativePath>../pom.xml</relativePath>
-	</parent>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.google.android</groupId>
-			<artifactId>android</artifactId>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.actionbarsherlock</groupId>
-			<artifactId>library</artifactId>
-			<version>${project.version}</version>
-			<type>apklib</type>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<sourceDirectory>src</sourceDirectory>
-		<finalName>${apk.prefix}-${project.artifactId}-${project.version}-unaligned</finalName>
-
-		<plugins>
-			<plugin>
-				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
-				<artifactId>android-maven-plugin</artifactId>
-				<extensions>true</extensions>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>zipalign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jarsigner-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>sign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-checkstyle-plugin</artifactId>
-				<configuration>
-					<configLocation>../../checkstyle.xml</configLocation>
-				</configuration>
-				<executions>
-					<execution>
-						<phase>verify</phase>
-						<goals>
-							<goal>checkstyle</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-
-	<profiles>
-		<profile>
-			<id>abs-release</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>com.github.github</groupId>
-						<artifactId>downloads-maven-plugin</artifactId>
-						<executions>
-							<execution>
-								<phase>deploy</phase>
-								<goals>
-									<goal>upload</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-</project>
diff --git a/samples/fragments/project.properties b/samples/fragments/project.properties
deleted file mode 100644
index cd1e0a1..0000000
--- a/samples/fragments/project.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-14
-android.library.reference.1=../../library
-
diff --git a/samples/fragments/res/anim/decelerate_quint.xml b/samples/fragments/res/anim/decelerate_quint.xml
deleted file mode 100644
index ff2d5a9..0000000
--- a/samples/fragments/res/anim/decelerate_quint.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2010, 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.
-*/
--->
-
-<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
-        android:factor="2.5" />
diff --git a/samples/fragments/res/anim/fragment_slide_left_enter.xml b/samples/fragments/res/anim/fragment_slide_left_enter.xml
deleted file mode 100644
index 6bbf6a2..0000000
--- a/samples/fragments/res/anim/fragment_slide_left_enter.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-        android:interpolator="@anim/decelerate_quint">
-    <translate android:fromXDelta="33%" android:toXDelta="0%p"
-            android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
-            android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/samples/fragments/res/anim/fragment_slide_left_exit.xml b/samples/fragments/res/anim/fragment_slide_left_exit.xml
deleted file mode 100644
index 0affbc7..0000000
--- a/samples/fragments/res/anim/fragment_slide_left_exit.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-        android:interpolator="@anim/decelerate_quint">
-    <translate android:fromXDelta="0%" android:toXDelta="-33%p"
-            android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
-            android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/samples/fragments/res/anim/fragment_slide_right_enter.xml b/samples/fragments/res/anim/fragment_slide_right_enter.xml
deleted file mode 100644
index e2e1168..0000000
--- a/samples/fragments/res/anim/fragment_slide_right_enter.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-        android:interpolator="@anim/decelerate_quint">
-    <translate android:fromXDelta="-33%" android:toXDelta="0%p"
-            android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
-            android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/samples/fragments/res/anim/fragment_slide_right_exit.xml b/samples/fragments/res/anim/fragment_slide_right_exit.xml
deleted file mode 100644
index c8e6e7c..0000000
--- a/samples/fragments/res/anim/fragment_slide_right_exit.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-        android:interpolator="@anim/decelerate_quint">
-    <translate android:fromXDelta="0%" android:toXDelta="33%p"
-            android:duration="@android:integer/config_mediumAnimTime"/>
-    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
-            android:duration="@android:integer/config_mediumAnimTime" />
-</set>
diff --git a/samples/fragments/res/drawable-hdpi/alert_dialog_icon.png b/samples/fragments/res/drawable-hdpi/alert_dialog_icon.png
deleted file mode 100755
index fe54477..0000000
--- a/samples/fragments/res/drawable-hdpi/alert_dialog_icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/ic_compose.png b/samples/fragments/res/drawable-hdpi/ic_compose.png
deleted file mode 100644
index cdb09e4..0000000
--- a/samples/fragments/res/drawable-hdpi/ic_compose.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/ic_compose_inverse.png b/samples/fragments/res/drawable-hdpi/ic_compose_inverse.png
deleted file mode 100644
index 8a0c487..0000000
--- a/samples/fragments/res/drawable-hdpi/ic_compose_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/ic_refresh.png b/samples/fragments/res/drawable-hdpi/ic_refresh.png
deleted file mode 100644
index 08c32e0..0000000
--- a/samples/fragments/res/drawable-hdpi/ic_refresh.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/ic_refresh_inverse.png b/samples/fragments/res/drawable-hdpi/ic_refresh_inverse.png
deleted file mode 100644
index 9ab1d38..0000000
--- a/samples/fragments/res/drawable-hdpi/ic_refresh_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/ic_search.png b/samples/fragments/res/drawable-hdpi/ic_search.png
deleted file mode 100644
index 59de344..0000000
--- a/samples/fragments/res/drawable-hdpi/ic_search.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/ic_search_inverse.png b/samples/fragments/res/drawable-hdpi/ic_search_inverse.png
deleted file mode 100644
index eb090a6..0000000
--- a/samples/fragments/res/drawable-hdpi/ic_search_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-hdpi/icon.png b/samples/fragments/res/drawable-hdpi/icon.png
deleted file mode 100644
index 723fbf0..0000000
--- a/samples/fragments/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-ldpi/icon.png b/samples/fragments/res/drawable-ldpi/icon.png
deleted file mode 100644
index 181f679..0000000
--- a/samples/fragments/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/alert_dialog_icon.png b/samples/fragments/res/drawable-mdpi/alert_dialog_icon.png
deleted file mode 100644
index 0a7de04..0000000
--- a/samples/fragments/res/drawable-mdpi/alert_dialog_icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/ic_compose.png b/samples/fragments/res/drawable-mdpi/ic_compose.png
deleted file mode 100644
index 15a4130..0000000
--- a/samples/fragments/res/drawable-mdpi/ic_compose.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/ic_compose_inverse.png b/samples/fragments/res/drawable-mdpi/ic_compose_inverse.png
deleted file mode 100644
index de58ce8..0000000
--- a/samples/fragments/res/drawable-mdpi/ic_compose_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/ic_refresh.png b/samples/fragments/res/drawable-mdpi/ic_refresh.png
deleted file mode 100644
index 55c43c3..0000000
--- a/samples/fragments/res/drawable-mdpi/ic_refresh.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/ic_refresh_inverse.png b/samples/fragments/res/drawable-mdpi/ic_refresh_inverse.png
deleted file mode 100644
index d5736ec..0000000
--- a/samples/fragments/res/drawable-mdpi/ic_refresh_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/ic_search.png b/samples/fragments/res/drawable-mdpi/ic_search.png
deleted file mode 100644
index 75339d9..0000000
--- a/samples/fragments/res/drawable-mdpi/ic_search.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/ic_search_inverse.png b/samples/fragments/res/drawable-mdpi/ic_search_inverse.png
deleted file mode 100644
index b462c32..0000000
--- a/samples/fragments/res/drawable-mdpi/ic_search_inverse.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-mdpi/icon.png b/samples/fragments/res/drawable-mdpi/icon.png
deleted file mode 100644
index 79f50d8..0000000
--- a/samples/fragments/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/drawable-xhdpi/icon.png b/samples/fragments/res/drawable-xhdpi/icon.png
deleted file mode 100644
index 34ca9a4..0000000
--- a/samples/fragments/res/drawable-xhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/fragments/res/layout-land/fragment_arguments_support.xml b/samples/fragments/res/layout-land/fragment_arguments_support.xml
deleted file mode 100644
index a812fa0..0000000
--- a/samples/fragments/res/layout-land/fragment_arguments_support.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- Top-level content view for the simple fragment sample. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:padding="4dip"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <TextView
-            android:id="@+id/text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:padding="4dip"
-            android:layout_gravity="center_vertical|center_horizontal"
-            android:gravity="top|center_horizontal"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/fragment_arguments_msg" />
-
-    <LinearLayout android:orientation="horizontal" android:padding="4dip"
-        android:layout_width="match_parent" android:layout_height="wrap_content">
-
-        <fragment class="com.actionbarsherlock.sample.fragments.FragmentArgumentsSupport$MyFragment"
-                android:id="@+id/embedded"
-                android:layout_width="0px" android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:label="@string/fragment_arguments_embedded" />
-
-        <FrameLayout
-                android:id="@+id/created"
-                android:layout_width="0px"
-                android:layout_height="wrap_content"
-                android:layout_weight="1" />
-
-    </LinearLayout>
-
-    <fragment class="com.actionbarsherlock.sample.fragments.FragmentArgumentsSupport$MyFragment"
-            android:id="@+id/embedded_land"
-            android:layout_width="match_parent" android:layout_height="wrap_content"
-            android:label="@string/fragment_arguments_embedded_land" />
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout-land/fragment_layout_support.xml b/samples/fragments/res/layout-land/fragment_layout_support.xml
deleted file mode 100644
index 495162b..0000000
--- a/samples/fragments/res/layout-land/fragment_layout_support.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Top-level content view for the layout fragment sample.  This version is
-     for display when in landscape: we can fit both titles and dialog. -->
-
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <fragment class="com.actionbarsherlock.sample.fragments.FragmentLayoutSupport$TitlesFragment"
-            android:id="@+id/titles" android:layout_weight="1"
-            android:layout_width="0px" android:layout_height="match_parent" />
-
-    <FrameLayout android:id="@+id/details" android:layout_weight="1"
-            android:layout_width="0px" android:layout_height="match_parent" />
-
-</LinearLayout>
-
diff --git a/samples/fragments/res/layout/fragment_arguments_support.xml b/samples/fragments/res/layout/fragment_arguments_support.xml
deleted file mode 100644
index 63ee0b1..0000000
--- a/samples/fragments/res/layout/fragment_arguments_support.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- Top-level content view for the simple fragment sample. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:padding="4dip"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <TextView
-            android:id="@+id/text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:padding="4dip"
-            android:layout_gravity="center_vertical|center_horizontal"
-            android:gravity="top|center_horizontal"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/fragment_arguments_msg" />
-
-    <LinearLayout android:orientation="horizontal" android:padding="4dip"
-        android:layout_width="match_parent" android:layout_height="wrap_content">
-
-
-        <fragment class="com.actionbarsherlock.sample.fragments.FragmentArgumentsSupport$MyFragment"
-                android:id="@+id/embedded"
-                android:layout_width="0px" android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:label="@string/fragment_arguments_embedded" />
-
-
-        <FrameLayout
-                android:id="@+id/created"
-                android:layout_width="0px"
-                android:layout_height="wrap_content"
-                android:layout_weight="1" />
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_context_menu.xml b/samples/fragments/res/layout/fragment_context_menu.xml
deleted file mode 100644
index b5dac8e..0000000
--- a/samples/fragments/res/layout/fragment_context_menu.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="8dp">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/fragment_context_menu_msg" />
-
-    <Button android:id="@+id/long_press"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:text="@string/long_press">
-        <requestFocus />
-    </Button>
-    
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_dialog.xml b/samples/fragments/res/layout/fragment_dialog.xml
deleted file mode 100644
index f9dec59..0000000
--- a/samples/fragments/res/layout/fragment_dialog.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Top-level content view for the simple fragment sample. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:padding="4dip"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <TextView
-            android:id="@+id/text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:layout_gravity="center_vertical|center_horizontal"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:gravity="top|center_horizontal" />
-
-    <Button android:id="@+id/show"
-        android:layout_width="wrap_content" android:layout_height="wrap_content"
-        android:layout_weight="0"
-        android:text="@string/show">
-        <requestFocus />
-    </Button>
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_dialog_or_activity.xml b/samples/fragments/res/layout/fragment_dialog_or_activity.xml
deleted file mode 100644
index 295f017..0000000
--- a/samples/fragments/res/layout/fragment_dialog_or_activity.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Top-level content view for the simple fragment sample. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:padding="4dip"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <TextView
-            android:id="@+id/text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:layout_gravity="center_vertical|center_horizontal"
-            android:gravity="top|center_horizontal"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/fragment_dialog_or_activity_msg" />
-
-    <Button android:id="@+id/show_dialog"
-        android:layout_width="wrap_content" android:layout_height="wrap_content"
-        android:layout_weight="0"
-        android:text="@string/show">
-        <requestFocus />
-    </Button>
-
-    <View android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1" />
-
-    <TextView
-            android:id="@+id/inline_text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:layout_gravity="center_vertical|center_horizontal"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/fragment_dialog_or_activity_inline" />
-
-    <FrameLayout
-            android:id="@+id/embedded"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:layout_gravity="center_vertical|center_horizontal"
-            android:padding="6dp"
-            android:background="#ff303030"
-            android:gravity="top|center_horizontal" />
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_hide_show_support.xml b/samples/fragments/res/layout/fragment_hide_show_support.xml
deleted file mode 100644
index 45001bd..0000000
--- a/samples/fragments/res/layout/fragment_hide_show_support.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<!-- Top-level content view for the layout fragment sample. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <TextView android:layout_width="match_parent" android:layout_height="wrap_content"
-        android:gravity="center_vertical|center_horizontal"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="Demonstration of hiding and showing fragments." />
-
-    <LinearLayout android:orientation="horizontal" android:padding="4dip"
-        android:gravity="center_vertical" android:layout_weight="1"
-        android:layout_width="match_parent" android:layout_height="wrap_content">
-
-        <Button android:id="@+id/frag1hide"
-            android:layout_width="wrap_content" android:layout_height="wrap_content"
-            android:text="Hide" />
-
-        <fragment android:name="com.actionbarsherlock.sample.fragments.FragmentHideShowSupport$FirstFragment"
-                android:id="@+id/fragment1" android:layout_weight="1"
-                android:layout_width="0px" android:layout_height="wrap_content" />
-
-    </LinearLayout>
-
-    <LinearLayout android:orientation="horizontal" android:padding="4dip"
-        android:gravity="center_vertical" android:layout_weight="1"
-        android:layout_width="match_parent" android:layout_height="wrap_content">
-
-        <Button android:id="@+id/frag2hide"
-            android:layout_width="wrap_content" android:layout_height="wrap_content"
-            android:text="Hide" />
-
-        <fragment android:name="com.actionbarsherlock.sample.fragments.FragmentHideShowSupport$SecondFragment"
-                android:id="@+id/fragment2" android:layout_weight="1"
-                android:layout_width="0px" android:layout_height="wrap_content" />
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_layout_support.xml b/samples/fragments/res/layout/fragment_layout_support.xml
deleted file mode 100644
index da82394..0000000
--- a/samples/fragments/res/layout/fragment_layout_support.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Top-level content view for the layout fragment sample.  This version is
-     for display when not in landscape: we can only fit the list of titles. -->
-
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-    <fragment class="com.actionbarsherlock.sample.fragments.FragmentLayoutSupport$TitlesFragment"
-            android:id="@+id/titles"
-            android:layout_width="match_parent" android:layout_height="match_parent" />
-</FrameLayout>
-
diff --git a/samples/fragments/res/layout/fragment_menu.xml b/samples/fragments/res/layout/fragment_menu.xml
deleted file mode 100644
index 7f0278c..0000000
--- a/samples/fragments/res/layout/fragment_menu.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="8dp">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/fragment_menu_msg" />
-
-    <CheckBox android:id="@+id/menu1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:checked="true"
-        android:text="@string/fragment1menu">
-    </CheckBox>
-    
-    <CheckBox android:id="@+id/menu2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:checked="true"
-        android:text="@string/fragment2menu">
-    </CheckBox>
-    
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_pager.xml b/samples/fragments/res/layout/fragment_pager.xml
deleted file mode 100644
index afaf3e7..0000000
--- a/samples/fragments/res/layout/fragment_pager.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Top-level content view for the simple fragment sample. -->
-
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:orientation="vertical" android:padding="4dip"
-        android:gravity="center_horizontal"
-        android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <android.support.v4.view.ViewPager
-            android:id="@+id/pager"
-            android:layout_width="match_parent"
-            android:layout_height="0px"
-            android:layout_weight="1">
-    </android.support.v4.view.ViewPager>
-
-    <LinearLayout android:orientation="horizontal"
-            android:gravity="center" android:measureWithLargestChild="true"
-            android:layout_width="match_parent" android:layout_height="wrap_content"
-            android:layout_weight="0">
-        <Button android:id="@+id/goto_first"
-            android:layout_width="wrap_content" android:layout_height="wrap_content"
-            android:text="@string/first">
-        </Button>
-        <Button android:id="@+id/goto_last"
-            android:layout_width="wrap_content" android:layout_height="wrap_content"
-            android:text="@string/last">
-        </Button>
-    </LinearLayout>
-</LinearLayout>
-
diff --git a/samples/fragments/res/layout/fragment_pager_list.xml b/samples/fragments/res/layout/fragment_pager_list.xml
deleted file mode 100644
index c817ae5..0000000
--- a/samples/fragments/res/layout/fragment_pager_list.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@android:drawable/gallery_thumb">
-
-    <TextView android:id="@+id/text"
-        android:layout_width="match_parent" android:layout_height="wrap_content"
-        android:gravity="center_vertical|center_horizontal"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/hello_world"/>
-
-    <!-- The frame layout is here since we will be showing either
-    the empty view or the list view.  -->
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1" >
-        <!-- Here is the list. Since we are using a ListActivity, we
-             have to call it "@android:id/list" so ListActivity will
-             find it -->
-        <ListView android:id="@android:id/list"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:drawSelectorOnTop="false"/>
-
-        <!-- Here is the view to show if the list is emtpy -->
-        <TextView android:id="@android:id/empty"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="No items."/>
-
-    </FrameLayout>
-
-</LinearLayout>
-
diff --git a/samples/fragments/res/layout/fragment_retain_instance.xml b/samples/fragments/res/layout/fragment_retain_instance.xml
deleted file mode 100644
index 0dc3985..0000000
--- a/samples/fragments/res/layout/fragment_retain_instance.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="8dp">
-
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/fragment_retain_instance_msg" />
-
-    <ProgressBar android:id="@+id/progress_horizontal"
-        style="?android:attr/progressBarStyleHorizontal"
-        android:layout_width="200dip"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:padding="6dp"
-        android:max="500" />
-
-    <Button android:id="@+id/restart"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:text="@string/restart">
-        <requestFocus />
-    </Button>
-    
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_stack.xml b/samples/fragments/res/layout/fragment_stack.xml
deleted file mode 100644
index 1d12496..0000000
--- a/samples/fragments/res/layout/fragment_stack.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Top-level content view for the simple fragment sample. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:padding="4dip"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <FrameLayout
-            android:id="@+id/simple_fragment"
-            android:layout_width="match_parent"
-            android:layout_height="0px"
-            android:layout_weight="1">
-    </FrameLayout>
-
-    <Button android:id="@+id/new_fragment"
-        android:layout_width="wrap_content" android:layout_height="wrap_content"
-        android:layout_weight="0" 
-        android:text="@string/new_fragment">
-        <requestFocus />
-    </Button>
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout/fragment_tabs.xml b/samples/fragments/res/layout/fragment_tabs.xml
deleted file mode 100644
index 0fb142c..0000000
--- a/samples/fragments/res/layout/fragment_tabs.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/layout/tab_content.xml
-**
-** Copyright 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.
-*/
--->
-
-
-<TabHost
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/tabhost"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <LinearLayout
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <TabWidget
-            android:id="@android:id/tabs"
-            android:orientation="horizontal"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"/>
-
-        <FrameLayout
-            android:id="@android:id/tabcontent"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_weight="0"/>
-
-        <FrameLayout
-            android:id="@+android:id/realtabcontent"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"/>
-
-    </LinearLayout>
-</TabHost>
-
diff --git a/samples/fragments/res/layout/fragment_tabs_pager.xml b/samples/fragments/res/layout/fragment_tabs_pager.xml
deleted file mode 100644
index c36cf3c..0000000
--- a/samples/fragments/res/layout/fragment_tabs_pager.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/layout/tab_content.xml
-**
-** Copyright 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.
-*/
--->
-
-<TabHost
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/tabhost"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <LinearLayout
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <TabWidget
-            android:id="@android:id/tabs"
-            android:orientation="horizontal"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="0"/>
-
-        <FrameLayout
-            android:id="@android:id/tabcontent"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_weight="0"/>
-
-        <android.support.v4.view.ViewPager
-            android:id="@+id/pager"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1"/>
-
-    </LinearLayout>
-</TabHost>
diff --git a/samples/fragments/res/layout/hello_world.xml b/samples/fragments/res/layout/hello_world.xml
deleted file mode 100644
index 3d90a33..0000000
--- a/samples/fragments/res/layout/hello_world.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- Demonstrates basic application screen.
-     See corresponding Java code com.android.sdk.app.HelloWorld.java. -->
-
-<!-- This screen consists of a single text field that
-     displays our "Hello, World!" text. -->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text"
-    android:layout_width="match_parent" android:layout_height="match_parent"
-    android:gravity="center_vertical|center_horizontal"
-    android:textAppearance="?android:attr/textAppearanceMedium"
-    android:text="@string/hello_world"/>
diff --git a/samples/fragments/res/layout/labeled_text_edit.xml b/samples/fragments/res/layout/labeled_text_edit.xml
deleted file mode 100644
index 27568af..0000000
--- a/samples/fragments/res/layout/labeled_text_edit.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<!-- Content for a fragment with a text editor. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical" android:padding="4dip"
-    android:layout_width="match_parent" android:layout_height="wrap_content">
-
-    <TextView android:id="@+id/msg"
-        android:layout_width="match_parent" android:layout_height="wrap_content"
-        android:layout_weight="0"
-        android:paddingBottom="4dip" />
-
-    <EditText android:id="@+id/saved"
-        android:layout_width="match_parent" android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:background="@drawable/green"
-        android:text="@string/initial_text"
-        android:freezesText="true">
-        <requestFocus />
-    </EditText>
-
-</LinearLayout>
-
diff --git a/samples/fragments/res/layout/list_item_icon_text.xml b/samples/fragments/res/layout/list_item_icon_text.xml
deleted file mode 100644
index c3825b7..0000000
--- a/samples/fragments/res/layout/list_item_icon_text.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="horizontal"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ImageView android:id="@+id/icon"
-        android:layout_width="48dip"
-        android:layout_height="48dip" />
-
-    <TextView android:id="@+id/text"
-        android:layout_gravity="center_vertical"
-        android:layout_width="0dip"
-        android:layout_weight="1.0"
-        android:layout_height="wrap_content" />
-
-</LinearLayout>
diff --git a/samples/fragments/res/layout/receive_result.xml b/samples/fragments/res/layout/receive_result.xml
deleted file mode 100644
index 5deb2ac..0000000
--- a/samples/fragments/res/layout/receive_result.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!--
-    Demonstrates receiving activity results.
-    See corresponding Java code com.android.sdk.app.ReceiveResult.java.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip"
-    android:gravity="center_horizontal"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <TextView
-        android:layout_width="match_parent" android:layout_height="wrap_content"
-        android:layout_weight="0"
-        android:paddingBottom="4dip"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/receive_result_instructions"/>
-
-    <TextView android:id="@+id/results"
-        android:layout_width="match_parent" android:layout_height="10dip"
-        android:layout_weight="1"
-        android:paddingBottom="4dip"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:textColor="#000"
-        android:background="@drawable/green">
-    </TextView>
-
-    <Button android:id="@+id/get"
-        android:layout_width="wrap_content" android:layout_height="wrap_content" 
-        android:layout_weight="0"
-        android:text="@string/receive_result_result">
-        <requestFocus />
-    </Button>
-
-</LinearLayout>
-
diff --git a/samples/fragments/res/layout/send_result.xml b/samples/fragments/res/layout/send_result.xml
deleted file mode 100644
index bdd927c..0000000
--- a/samples/fragments/res/layout/send_result.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<!-- Demonstrates receiving activity results.
-     See corresponding Java code com.android.sdk.app.ReceiveResult.java. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent" android:layout_height="match_parent"
-        android:orientation="vertical"
-        android:padding="4dip"
-        android:gravity="center_horizontal">
-
-    <TextView
-            android:layout_width="match_parent" android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:paddingBottom="8dip"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/pick_result"/>
-
-    <Button android:id="@+id/corky"
-            android:layout_width="wrap_content" android:layout_height="wrap_content"
-            android:text="@string/corky">
-            <requestFocus />
-    </Button>
-
-    <Button android:id="@+id/violet"
-            android:layout_width="wrap_content" android:layout_height="wrap_content"
-            android:text="@string/violet">
-    </Button>
-
-</LinearLayout>
-
diff --git a/samples/fragments/res/layout/simple_list_item_checkable_1.xml b/samples/fragments/res/layout/simple_list_item_checkable_1.xml
deleted file mode 100644
index d122b5c..0000000
--- a/samples/fragments/res/layout/simple_list_item_checkable_1.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<com.actionbarsherlock.sample.fragments.CheckableFrameLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-    <TextView
-            android:id="@android:id/text1"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:minHeight="?android:attr/listPreferredItemHeight"
-            android:gravity="center_vertical"
-    />
-</com.actionbarsherlock.sample.fragments.CheckableFrameLayout>
diff --git a/samples/fragments/res/menu/shortcuts.xml b/samples/fragments/res/menu/shortcuts.xml
deleted file mode 100644
index b5e938a..0000000
--- a/samples/fragments/res/menu/shortcuts.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:id="@+id/invisible_item"
-        android:visible="false"
-        android:alphabeticShortcut="i"
-        android:title="Invisible item" />
-
-    <item android:id="@+id/a_item"
-        android:alphabeticShortcut="a"
-        android:title="Alvin" />
-
-    <item android:id="@+id/b_item"
-        android:alphabeticShortcut="b"
-        android:title="Bart" />
-
-    <item android:id="@+id/c_item"
-        android:alphabeticShortcut="c"
-        android:title="Chris" />
-
-    <item android:id="@+id/d_item"
-        android:alphabeticShortcut="d"
-        android:title="David" />
-
-    <item android:id="@+id/e_item"
-        android:alphabeticShortcut="e"
-        android:title="Eric" />
-
-    <item android:id="@+id/f_item"
-        android:alphabeticShortcut="f"
-        android:title="Frank" />
-
-    <item android:id="@+id/g_item"
-        android:alphabeticShortcut="g"
-        android:title="Gary" />
-
-    <item android:id="@+id/h_item"
-        android:alphabeticShortcut="h"
-        android:title="Henry" />
-
-    <item android:id="@+id/excl_item"
-        android:alphabeticShortcut="!"
-        android:title="Exclamation" />
-
-</menu>
diff --git a/samples/fragments/res/values/attrs.xml b/samples/fragments/res/values/attrs.xml
deleted file mode 100644
index 0459aa5..0000000
--- a/samples/fragments/res/values/attrs.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <!-- These are the attributes that we want to retrieve for
-         app/FragmentArguments.java -->
-
-    <declare-styleable name="FragmentArguments">
-        <attr name="android:label" />
-    </declare-styleable>
-
-</resources>
diff --git a/samples/fragments/res/values/colors.xml b/samples/fragments/res/values/colors.xml
deleted file mode 100644
index a52502e..0000000
--- a/samples/fragments/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<resources>
-    <drawable name="red">#7f00</drawable>
-    <drawable name="blue">#770000ff</drawable>
-    <drawable name="green">#7700ff00</drawable>
-	<drawable name="yellow">#77ffff00</drawable>
-</resources>
diff --git a/samples/fragments/res/values/strings.xml b/samples/fragments/res/values/strings.xml
deleted file mode 100644
index 858d100..0000000
--- a/samples/fragments/res/values/strings.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="application_name">ActionBarSherlock Fragments</string>
-    <string name="activity_sample_code">ABS: Fragments</string>
-
-    <string name="hello_world"><b>Hello, <i>World!</i></b></string>
-    <string name="alert_dialog_two_buttons_title">
-        Lorem ipsum dolor sit aie consectetur adipiscing\nPlloaso mako nuto
-        siwuf cakso dodtos anr koop.
-    </string>
-    <string name="alert_dialog_ok">OK</string>
-    <string name="alert_dialog_cancel">Cancel</string>
-    
-    <string name="initial_text">Initial text.</string>
-    
-    <string name="pick_result">Pick a result to send, or BACK to cancel.</string>
-    <string name="corky">Corky</string>
-    <string name="violet">Violet</string>
-    <string name="receive_result_instructions">Press the button to get an activity result, which will be displayed here:</string>
-    <string name="receive_result_result">Get Result</string>
-    
-    <string name="fragment_alert_dialog_support">Alert Dialog</string>
-
-    <string name="fragment_arguments_support">Arguments</string>
-    <string name="fragment_arguments_msg">Demonstrates a fragment that takes arguments
-        as a Bundle at runtime (on the right) or from attributes in a layout (on the left).</string>
-    <string name="fragment_arguments_embedded">From Attributes</string>
-    <string name="fragment_arguments_embedded_land">Landscape Only</string>
-
-    <string name="fragment_custom_animation_support">Custom Animation</string>
-
-    <string name="fragment_hide_show_support">Hide and Show</string>
-
-    <string name="fragment_context_menu_support">Context Menu</string>
-    <string name="fragment_context_menu_msg">Fragment populating a context
-            menu; long press the button to see.</string>
-    <string name="long_press">Long press me</string>
-
-    <string name="fragment_dialog_support">Dialog</string>
-    <string name="show">Show</string>
-
-    <string name="fragment_dialog_or_activity_support">Dialog or Activity</string>
-    <string name="fragment_dialog_or_activity_msg">Demonstrates the same fragment
-            being shown as a dialog and embedded inside of an activity.</string>
-    <string name="fragment_dialog_or_activity_inline">Fragment embedded inside
-            of the activity:</string>
-
-    <string name="fragment_layout_support">Layout</string>
-
-    <string name="fragment_list_array_support">List Array</string>
-
-    <string name="fragment_menu_support">Menu</string>
-    <string name="fragment_menu_msg">Build menus from two fragments, allowing
-        you to hide them to remove them..</string>
-    <string name="fragment1menu">Show fragment 1 menu</string>
-    <string name="fragment2menu">Show fragment 2 menu</string>
-
-    <string name="fragment_retain_instance_support">Retain Instance</string>
-    <string name="fragment_retain_instance_msg">Current progress of retained fragment;
-    restarts if fragment is re-created.</string>
-    <string name="restart">Restart</string>
-
-    <string name="fragment_receive_result_support">Receive Result</string>
-
-    <string name="fragment_stack_support">Stack</string>
-    <string name="new_fragment">New fragment</string>
-
-    <string name="fragment_tabs">Tabs</string>
-
-    <string name="fragment_tabs_pager">Tabs and Pager</string>
-
-    <string name="fragment_pager_support">Pager</string>
-    <string name="first">First</string>
-    <string name="last">Last</string>
-
-    <string name="fragment_state_pager_support">State Pager</string>
-
-</resources>
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/CheckableFrameLayout.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/CheckableFrameLayout.java
deleted file mode 100644
index cb6b7a4..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/CheckableFrameLayout.java
+++ /dev/null
@@ -1,49 +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.actionbarsherlock.sample.fragments;
-
-import android.content.Context;
-import android.graphics.drawable.ColorDrawable;
-import android.util.AttributeSet;
-import android.widget.Checkable;
-import android.widget.FrameLayout;
-
-public class CheckableFrameLayout extends FrameLayout implements Checkable {
-    private boolean mChecked;
-
-    public CheckableFrameLayout(Context context) {
-        super(context);
-    }
-
-    public CheckableFrameLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public void setChecked(boolean checked) {
-        mChecked = checked;
-        setBackgroundDrawable(checked ? new ColorDrawable(0xff0000a0) : null);
-    }
-
-    public boolean isChecked() {
-        return mChecked;
-    }
-
-    public void toggle() {
-        setChecked(!mChecked);
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/Cheeses.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/Cheeses.java
deleted file mode 100644
index cc288bc..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/Cheeses.java
+++ /dev/null
@@ -1,154 +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.actionbarsherlock.sample.fragments;
-
-public class Cheeses {
-
-    public static final String[] sCheeseStrings = {
-            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
-            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
-            "Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
-            "Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
-            "Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
-            "Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
-            "Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
-            "Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
-            "Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
-            "Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
-            "Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
-            "Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
-            "Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
-            "Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
-            "Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
-            "Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
-            "Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
-            "Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
-            "Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
-            "Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
-            "Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
-            "Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",
-            "Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
-            "Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",
-            "Capriole Banon", "Carre de l'Est", "Casciotta di Urbino", "Cashel Blue", "Castellano",
-            "Castelleno", "Castelmagno", "Castelo Branco", "Castigliano", "Cathelain",
-            "Celtic Promise", "Cendre d'Olivet", "Cerney", "Chabichou", "Chabichou du Poitou",
-            "Chabis de Gatine", "Chaource", "Charolais", "Chaumes", "Cheddar",
-            "Cheddar Clothbound", "Cheshire", "Chevres", "Chevrotin des Aravis", "Chontaleno",
-            "Civray", "Coeur de Camembert au Calvados", "Coeur de Chevre", "Colby", "Cold Pack",
-            "Comte", "Coolea", "Cooleney", "Coquetdale", "Corleggy", "Cornish Pepper",
-            "Cotherstone", "Cotija", "Cottage Cheese", "Cottage Cheese (Australian)",
-            "Cougar Gold", "Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese",
-            "Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche", "Crescenza",
-            "Croghan", "Crottin de Chavignol", "Crottin du Chavignol", "Crowdie", "Crowley",
-            "Cuajada", "Curd", "Cure Nantais", "Curworthy", "Cwmtawe Pecorino",
-            "Cypress Grove Chevre", "Danablu (Danish Blue)", "Danbo", "Danish Fontina",
-            "Daralagjazsky", "Dauphin", "Delice des Fiouves", "Denhany Dorset Drum", "Derby",
-            "Dessertnyj Belyj", "Devon Blue", "Devon Garland", "Dolcelatte", "Doolin",
-            "Doppelrhamstufel", "Dorset Blue Vinney", "Double Gloucester", "Double Worcester",
-            "Dreux a la Feuille", "Dry Jack", "Duddleswell", "Dunbarra", "Dunlop", "Dunsyre Blue",
-            "Duroblando", "Durrus", "Dutch Mimolette (Commissiekaas)", "Edam", "Edelpilz",
-            "Emental Grand Cru", "Emlett", "Emmental", "Epoisses de Bourgogne", "Esbareich",
-            "Esrom", "Etorki", "Evansdale Farmhouse Brie", "Evora De L'Alentejo", "Exmoor Blue",
-            "Explorateur", "Feta", "Feta (Australian)", "Figue", "Filetta", "Fin-de-Siecle",
-            "Finlandia Swiss", "Finn", "Fiore Sardo", "Fleur du Maquis", "Flor de Guia",
-            "Flower Marie", "Folded", "Folded cheese with mint", "Fondant de Brebis",
-            "Fontainebleau", "Fontal", "Fontina Val d'Aosta", "Formaggio di capra", "Fougerus",
-            "Four Herb Gouda", "Fourme d' Ambert", "Fourme de Haute Loire", "Fourme de Montbrison",
-            "Fresh Jack", "Fresh Mozzarella", "Fresh Ricotta", "Fresh Truffles", "Fribourgeois",
-            "Friesekaas", "Friesian", "Friesla", "Frinault", "Fromage a Raclette", "Fromage Corse",
-            "Fromage de Montagne de Savoie", "Fromage Frais", "Fruit Cream Cheese",
-            "Frying Cheese", "Fynbo", "Gabriel", "Galette du Paludier", "Galette Lyonnaise",
-            "Galloway Goat's Milk Gems", "Gammelost", "Gaperon a l'Ail", "Garrotxa", "Gastanberra",
-            "Geitost", "Gippsland Blue", "Gjetost", "Gloucester", "Golden Cross", "Gorgonzola",
-            "Gornyaltajski", "Gospel Green", "Gouda", "Goutu", "Gowrie", "Grabetto", "Graddost",
-            "Grafton Village Cheddar", "Grana", "Grana Padano", "Grand Vatel",
-            "Grataron d' Areches", "Gratte-Paille", "Graviera", "Greuilh", "Greve",
-            "Gris de Lille", "Gruyere", "Gubbeen", "Guerbigny", "Halloumi",
-            "Halloumy (Australian)", "Haloumi-Style Cheese", "Harbourne Blue", "Havarti",
-            "Heidi Gruyere", "Hereford Hop", "Herrgardsost", "Herriot Farmhouse", "Herve",
-            "Hipi Iti", "Hubbardston Blue Cow", "Hushallsost", "Iberico", "Idaho Goatster",
-            "Idiazabal", "Il Boschetto al Tartufo", "Ile d'Yeu", "Isle of Mull", "Jarlsberg",
-            "Jermi Tortes", "Jibneh Arabieh", "Jindi Brie", "Jubilee Blue", "Juustoleipa",
-            "Kadchgall", "Kaseri", "Kashta", "Kefalotyri", "Kenafa", "Kernhem", "Kervella Affine",
-            "Kikorangi", "King Island Cape Wickham Brie", "King River Gold", "Klosterkaese",
-            "Knockalara", "Kugelkase", "L'Aveyronnais", "L'Ecir de l'Aubrac", "La Taupiniere",
-            "La Vache Qui Rit", "Laguiole", "Lairobell", "Lajta", "Lanark Blue", "Lancashire",
-            "Langres", "Lappi", "Laruns", "Lavistown", "Le Brin", "Le Fium Orbo", "Le Lacandou",
-            "Le Roule", "Leafield", "Lebbene", "Leerdammer", "Leicester", "Leyden", "Limburger",
-            "Lincolnshire Poacher", "Lingot Saint Bousquet d'Orb", "Liptauer", "Little Rydings",
-            "Livarot", "Llanboidy", "Llanglofan Farmhouse", "Loch Arthur Farmhouse",
-            "Loddiswell Avondale", "Longhorn", "Lou Palou", "Lou Pevre", "Lyonnais", "Maasdam",
-            "Macconais", "Mahoe Aged Gouda", "Mahon", "Malvern", "Mamirolle", "Manchego",
-            "Manouri", "Manur", "Marble Cheddar", "Marbled Cheeses", "Maredsous", "Margotin",
-            "Maribo", "Maroilles", "Mascares", "Mascarpone", "Mascarpone (Australian)",
-            "Mascarpone Torta", "Matocq", "Maytag Blue", "Meira", "Menallack Farmhouse",
-            "Menonita", "Meredith Blue", "Mesost", "Metton (Cancoillotte)", "Meyer Vintage Gouda",
-            "Mihalic Peynir", "Milleens", "Mimolette", "Mine-Gabhar", "Mini Baby Bells", "Mixte",
-            "Molbo", "Monastery Cheeses", "Mondseer", "Mont D'or Lyonnais", "Montasio",
-            "Monterey Jack", "Monterey Jack Dry", "Morbier", "Morbier Cru de Montagne",
-            "Mothais a la Feuille", "Mozzarella", "Mozzarella (Australian)",
-            "Mozzarella di Bufala", "Mozzarella Fresh, in water", "Mozzarella Rolls", "Munster",
-            "Murol", "Mycella", "Myzithra", "Naboulsi", "Nantais", "Neufchatel",
-            "Neufchatel (Australian)", "Niolo", "Nokkelost", "Northumberland", "Oaxaca",
-            "Olde York", "Olivet au Foin", "Olivet Bleu", "Olivet Cendre",
-            "Orkney Extra Mature Cheddar", "Orla", "Oschtjepka", "Ossau Fermier", "Ossau-Iraty",
-            "Oszczypek", "Oxford Blue", "P'tit Berrichon", "Palet de Babligny", "Paneer", "Panela",
-            "Pannerone", "Pant ys Gawn", "Parmesan (Parmigiano)", "Parmigiano Reggiano",
-            "Pas de l'Escalette", "Passendale", "Pasteurized Processed", "Pate de Fromage",
-            "Patefine Fort", "Pave d'Affinois", "Pave d'Auge", "Pave de Chirac", "Pave du Berry",
-            "Pecorino", "Pecorino in Walnut Leaves", "Pecorino Romano", "Peekskill Pyramid",
-            "Pelardon des Cevennes", "Pelardon des Corbieres", "Penamellera", "Penbryn",
-            "Pencarreg", "Perail de Brebis", "Petit Morin", "Petit Pardou", "Petit-Suisse",
-            "Picodon de Chevre", "Picos de Europa", "Piora", "Pithtviers au Foin",
-            "Plateau de Herve", "Plymouth Cheese", "Podhalanski", "Poivre d'Ane", "Polkolbin",
-            "Pont l'Eveque", "Port Nicholson", "Port-Salut", "Postel", "Pouligny-Saint-Pierre",
-            "Pourly", "Prastost", "Pressato", "Prince-Jean", "Processed Cheddar", "Provolone",
-            "Provolone (Australian)", "Pyengana Cheddar", "Pyramide", "Quark",
-            "Quark (Australian)", "Quartirolo Lombardo", "Quatre-Vents", "Quercy Petit",
-            "Queso Blanco", "Queso Blanco con Frutas --Pina y Mango", "Queso de Murcia",
-            "Queso del Montsec", "Queso del Tietar", "Queso Fresco", "Queso Fresco (Adobera)",
-            "Queso Iberico", "Queso Jalapeno", "Queso Majorero", "Queso Media Luna",
-            "Queso Para Frier", "Queso Quesadilla", "Rabacal", "Raclette", "Ragusano", "Raschera",
-            "Reblochon", "Red Leicester", "Regal de la Dombes", "Reggianito", "Remedou",
-            "Requeson", "Richelieu", "Ricotta", "Ricotta (Australian)", "Ricotta Salata", "Ridder",
-            "Rigotte", "Rocamadour", "Rollot", "Romano", "Romans Part Dieu", "Roncal", "Roquefort",
-            "Roule", "Rouleau De Beaulieu", "Royalp Tilsit", "Rubens", "Rustinu", "Saaland Pfarr",
-            "Saanenkaese", "Saga", "Sage Derby", "Sainte Maure", "Saint-Marcellin",
-            "Saint-Nectaire", "Saint-Paulin", "Salers", "Samso", "San Simon", "Sancerre",
-            "Sap Sago", "Sardo", "Sardo Egyptian", "Sbrinz", "Scamorza", "Schabzieger", "Schloss",
-            "Selles sur Cher", "Selva", "Serat", "Seriously Strong Cheddar", "Serra da Estrela",
-            "Sharpam", "Shelburne Cheddar", "Shropshire Blue", "Siraz", "Sirene", "Smoked Gouda",
-            "Somerset Brie", "Sonoma Jack", "Sottocenare al Tartufo", "Soumaintrain",
-            "Sourire Lozerien", "Spenwood", "Sraffordshire Organic", "St. Agur Blue Cheese",
-            "Stilton", "Stinking Bishop", "String", "Sussex Slipcote", "Sveciaost", "Swaledale",
-            "Sweet Style Swiss", "Swiss", "Syrian (Armenian String)", "Tala", "Taleggio", "Tamie",
-            "Tasmania Highland Chevre Log", "Taupiniere", "Teifi", "Telemea", "Testouri",
-            "Tete de Moine", "Tetilla", "Texas Goat Cheese", "Tibet", "Tillamook Cheddar",
-            "Tilsit", "Timboon Brie", "Toma", "Tomme Brulee", "Tomme d'Abondance",
-            "Tomme de Chevre", "Tomme de Romans", "Tomme de Savoie", "Tomme des Chouans", "Tommes",
-            "Torta del Casar", "Toscanello", "Touree de L'Aubier", "Tourmalet",
-            "Trappe (Veritable)", "Trois Cornes De Vendee", "Tronchon", "Trou du Cru", "Truffe",
-            "Tupi", "Turunmaa", "Tymsboro", "Tyn Grug", "Tyning", "Ubriaco", "Ulloa",
-            "Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco", "Vendomois",
-            "Vieux Corse", "Vignotte", "Vulscombe", "Waimata Farmhouse Blue",
-            "Washed Rind Cheese (Australian)", "Waterloo", "Weichkaese", "Wellington",
-            "Wensleydale", "White Stilton", "Whitestone Farmhouse", "Wigmore", "Woodside Cabecou",
-            "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue",
-            "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"
-    };
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentAlertDialogSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentAlertDialogSupport.java
deleted file mode 100644
index 6c6abef..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentAlertDialogSupport.java
+++ /dev/null
@@ -1,109 +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.actionbarsherlock.sample.fragments;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockDialogFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * Demonstrates how to show an AlertDialog that is managed by a Fragment.
- */
-public class FragmentAlertDialogSupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_dialog);
-
-        View tv = findViewById(R.id.text);
-        ((TextView)tv).setText("Example of displaying an alert dialog with a DialogFragment");
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.show);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                showDialog();
-            }
-        });
-    }
-
-
-    void showDialog() {
-        DialogFragment newFragment = MyAlertDialogFragment.newInstance(
-                R.string.alert_dialog_two_buttons_title);
-        newFragment.show(getSupportFragmentManager(), "dialog");
-    }
-
-    public void doPositiveClick() {
-        // Do stuff here.
-        Log.i("FragmentAlertDialog", "Positive click!");
-    }
-
-    public void doNegativeClick() {
-        // Do stuff here.
-        Log.i("FragmentAlertDialog", "Negative click!");
-    }
-
-
-
-    public static class MyAlertDialogFragment extends SherlockDialogFragment {
-
-        public static MyAlertDialogFragment newInstance(int title) {
-            MyAlertDialogFragment frag = new MyAlertDialogFragment();
-            Bundle args = new Bundle();
-            args.putInt("title", title);
-            frag.setArguments(args);
-            return frag;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            int title = getArguments().getInt("title");
-
-            return new AlertDialog.Builder(getActivity())
-                    .setIcon(R.drawable.alert_dialog_icon)
-                    .setTitle(title)
-                    .setPositiveButton(R.string.alert_dialog_ok,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int whichButton) {
-                                ((FragmentAlertDialogSupport)getActivity()).doPositiveClick();
-                            }
-                        }
-                    )
-                    .setNegativeButton(R.string.alert_dialog_cancel,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int whichButton) {
-                                ((FragmentAlertDialogSupport)getActivity()).doNegativeClick();
-                            }
-                        }
-                    )
-                    .create();
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentArgumentsSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentArgumentsSupport.java
deleted file mode 100644
index 3310e0b..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentArgumentsSupport.java
+++ /dev/null
@@ -1,112 +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.actionbarsherlock.sample.fragments;
-
-import android.app.Activity;
-import android.content.res.TypedArray;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * Demonstrates a fragment that can be configured through both Bundle arguments
- * and layout attributes.
- */
-public class FragmentArgumentsSupport extends SherlockFragmentActivity {
-
-    @Override protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_arguments_support);
-
-        if (savedInstanceState == null) {
-            // First-time init; create fragment to embed in activity.
-            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-            Fragment newFragment = MyFragment.newInstance("From Arguments");
-            ft.add(R.id.created, newFragment);
-            ft.commit();
-        }
-    }
-
-
-
-    public static class MyFragment extends SherlockFragment {
-        CharSequence mLabel;
-
-        /**
-         * Create a new instance of MyFragment that will be initialized
-         * with the given arguments.
-         */
-        static MyFragment newInstance(CharSequence label) {
-            MyFragment f = new MyFragment();
-            Bundle b = new Bundle();
-            b.putCharSequence("label", label);
-            f.setArguments(b);
-            return f;
-        }
-
-        /**
-         * Parse attributes during inflation from a view hierarchy into the
-         * arguments we handle.
-         */
-        @Override public void onInflate(Activity activity, AttributeSet attrs,
-                Bundle savedInstanceState) {
-            super.onInflate(activity, attrs, savedInstanceState);
-
-            TypedArray a = activity.obtainStyledAttributes(attrs,
-                    R.styleable.FragmentArguments);
-            mLabel = a.getText(R.styleable.FragmentArguments_android_label);
-            a.recycle();
-        }
-
-        /**
-         * During creation, if arguments have been supplied to the fragment
-         * then parse those out.
-         */
-        @Override public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            Bundle args = getArguments();
-            if (args != null) {
-                CharSequence label = args.getCharSequence("label");
-                if (label != null) {
-                    mLabel = label;
-                }
-            }
-        }
-
-        /**
-         * Create the view for this fragment, using the arguments given to it.
-         */
-        @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.hello_world, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText(mLabel != null ? mLabel : "(no label)");
-            tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
-            return v;
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentContextMenuSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentContextMenuSupport.java
deleted file mode 100644
index a01e8bd..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentContextMenuSupport.java
+++ /dev/null
@@ -1,77 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * Demonstration of displaying a context menu from a fragment.
- */
-public class FragmentContextMenuSupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        // Create the list fragment and add it as our sole content.
-        ContextMenuFragment content = new ContextMenuFragment();
-        getSupportFragmentManager().beginTransaction().add(
-                android.R.id.content, content).commit();
-    }
-
-    public static class ContextMenuFragment extends SherlockFragment {
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View root = inflater.inflate(R.layout.fragment_context_menu, container, false);
-            registerForContextMenu(root.findViewById(R.id.long_press));
-            return root;
-        }
-
-        @Override
-        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-            super.onCreateContextMenu(menu, v, menuInfo);
-            menu.add(Menu.NONE, R.id.a_item, Menu.NONE, "Menu A");
-            menu.add(Menu.NONE, R.id.b_item, Menu.NONE, "Menu B");
-        }
-
-        @Override
-        public boolean onContextItemSelected(MenuItem item) {
-            switch (item.getItemId()) {
-                case R.id.a_item:
-                    Log.i("ContextMenu", "Item 1a was chosen");
-                    return true;
-                case R.id.b_item:
-                    Log.i("ContextMenu", "Item 1b was chosen");
-                    return true;
-            }
-            return super.onContextItemSelected(item);
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentCustomAnimationSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentCustomAnimationSupport.java
deleted file mode 100644
index 125103a..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentCustomAnimationSupport.java
+++ /dev/null
@@ -1,127 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-public class FragmentCustomAnimationSupport extends SherlockFragmentActivity {
-    int mStackLevel = 1;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_stack);
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.new_fragment);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                addFragmentToStack();
-            }
-        });
-
-        if (savedInstanceState == null) {
-            // Do first time initialization -- add initial fragment.
-            Fragment newFragment = CountingFragment.newInstance(mStackLevel);
-            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-            ft.add(R.id.simple_fragment, newFragment).commit();
-        } else {
-            mStackLevel = savedInstanceState.getInt("level");
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putInt("level", mStackLevel);
-    }
-
-
-    void addFragmentToStack() {
-        mStackLevel++;
-
-        // Instantiate a new fragment.
-        Fragment newFragment = CountingFragment.newInstance(mStackLevel);
-
-        // Add the fragment to the activity, pushing this transaction
-        // on to the back stack.
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-        ft.setCustomAnimations(R.anim.fragment_slide_left_enter,
-                R.anim.fragment_slide_left_exit,
-                R.anim.fragment_slide_right_enter,
-                R.anim.fragment_slide_right_exit);
-        ft.replace(R.id.simple_fragment, newFragment);
-        ft.addToBackStack(null);
-        ft.commit();
-    }
-
-
-
-    public static class CountingFragment extends SherlockFragment {
-        int mNum;
-
-        /**
-         * Create a new instance of CountingFragment, providing "num"
-         * as an argument.
-         */
-        static CountingFragment newInstance(int num) {
-            CountingFragment f = new CountingFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        /**
-         * When creating, retrieve this instance's number from its arguments.
-         */
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
-        }
-
-        /**
-         * The Fragment's UI is just a simple text view showing its
-         * instance number.
-         */
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.hello_world, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText("Fragment #" + mNum);
-            tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
-            return v;
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentDialogOrActivitySupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentDialogOrActivitySupport.java
deleted file mode 100644
index 718fc20..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentDialogOrActivitySupport.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2010 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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockDialogFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-public class FragmentDialogOrActivitySupport extends SherlockFragmentActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_dialog_or_activity);
-
-        if (savedInstanceState == null) {
-            // First-time init; create fragment to embed in activity.
-
-            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-            DialogFragment newFragment = MyDialogFragment.newInstance();
-            ft.add(R.id.embedded, newFragment);
-            ft.commit();
-
-        }
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.show_dialog);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                showDialog();
-            }
-        });
-    }
-
-
-    void showDialog() {
-        // Create the fragment and show it as a dialog.
-        DialogFragment newFragment = MyDialogFragment.newInstance();
-        newFragment.show(getSupportFragmentManager(), "dialog");
-    }
-
-
-
-    public static class MyDialogFragment extends SherlockDialogFragment {
-        static MyDialogFragment newInstance() {
-            return new MyDialogFragment();
-        }
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.hello_world, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText("This is an instance of MyDialogFragment");
-            return v;
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentDialogSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentDialogSupport.java
deleted file mode 100644
index ef9837b..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentDialogSupport.java
+++ /dev/null
@@ -1,167 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockDialogFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-public class FragmentDialogSupport extends SherlockFragmentActivity {
-    int mStackLevel = 0;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_dialog);
-
-        View tv = findViewById(R.id.text);
-        ((TextView)tv).setText("Example of displaying dialogs with a DialogFragment.  "
-                + "Press the show button below to see the first dialog; pressing "
-                + "successive show buttons will display other dialog styles as a "
-                + "stack, with dismissing or back going to the previous dialog.");
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.show);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                showDialog();
-            }
-        });
-
-        if (savedInstanceState != null) {
-            mStackLevel = savedInstanceState.getInt("level");
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putInt("level", mStackLevel);
-    }
-
-
-    void showDialog() {
-        mStackLevel++;
-
-        // DialogFragment.show() will take care of adding the fragment
-        // in a transaction.  We also want to remove any currently showing
-        // dialog, so make our own transaction and take care of that here.
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-        Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
-        if (prev != null) {
-            ft.remove(prev);
-        }
-        ft.addToBackStack(null);
-
-        // Create and show the dialog.
-        DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
-        newFragment.show(ft, "dialog");
-    }
-
-
-    static String getNameForNum(int num) {
-        switch ((num-1)%6) {
-            case 1: return "STYLE_NO_TITLE";
-            case 2: return "STYLE_NO_FRAME";
-            case 3: return "STYLE_NO_INPUT (this window can't receive input, so "
-                    + "you will need to press the bottom show button)";
-            case 4: return "STYLE_NORMAL with dark fullscreen theme";
-            case 5: return "STYLE_NORMAL with light theme";
-            case 6: return "STYLE_NO_TITLE with light theme";
-            case 7: return "STYLE_NO_FRAME with light theme";
-            case 8: return "STYLE_NORMAL with light fullscreen theme";
-        }
-        return "STYLE_NORMAL";
-    }
-
-
-    public static class MyDialogFragment extends SherlockDialogFragment {
-        int mNum;
-
-        /**
-         * Create a new instance of MyDialogFragment, providing "num"
-         * as an argument.
-         */
-        static MyDialogFragment newInstance(int num) {
-            MyDialogFragment f = new MyDialogFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments().getInt("num");
-
-            // Pick a style based on the num.
-            int style = DialogFragment.STYLE_NORMAL, theme = 0;
-            switch ((mNum-1)%6) {
-                case 1: style = DialogFragment.STYLE_NO_TITLE; break;
-                case 2: style = DialogFragment.STYLE_NO_FRAME; break;
-                case 3: style = DialogFragment.STYLE_NO_INPUT; break;
-                case 4: style = DialogFragment.STYLE_NORMAL; break;
-                case 5: style = DialogFragment.STYLE_NO_TITLE; break;
-                case 6: style = DialogFragment.STYLE_NO_FRAME; break;
-                case 7: style = DialogFragment.STYLE_NORMAL; break;
-            }
-            switch ((mNum-1)%6) {
-                case 2: theme = android.R.style.Theme_Panel; break;
-                case 4: theme = android.R.style.Theme; break;
-                case 5: theme = android.R.style.Theme_Light; break;
-                case 6: theme = android.R.style.Theme_Light_Panel; break;
-                case 7: theme = android.R.style.Theme_Light; break;
-            }
-            setStyle(style, theme);
-        }
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.fragment_dialog, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText("Dialog #" + mNum + ": using style "
-                    + getNameForNum(mNum));
-
-            // Watch for button clicks.
-            Button button = (Button)v.findViewById(R.id.show);
-            button.setOnClickListener(new OnClickListener() {
-                public void onClick(View v) {
-                    // When button is clicked, call up to owning activity.
-                    ((FragmentDialogSupport)getActivity()).showDialog();
-                }
-            });
-
-            return v;
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentHideShowSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentHideShowSupport.java
deleted file mode 100644
index 41ce407..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentHideShowSupport.java
+++ /dev/null
@@ -1,113 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * Demonstration of hiding and showing fragments.
- */
-public class FragmentHideShowSupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_hide_show_support);
-
-        // The content view embeds two fragments; now retrieve them and attach
-        // their "hide" button.
-        FragmentManager fm = getSupportFragmentManager();
-        addShowHideListener(R.id.frag1hide, fm.findFragmentById(R.id.fragment1));
-        addShowHideListener(R.id.frag2hide, fm.findFragmentById(R.id.fragment2));
-    }
-
-    void addShowHideListener(int buttonId, final Fragment fragment) {
-        final Button button = (Button)findViewById(buttonId);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-                ft.setCustomAnimations(android.R.anim.fade_in,
-                        android.R.anim.fade_out);
-                if (fragment.isHidden()) {
-                    ft.show(fragment);
-                    button.setText("Hide");
-                } else {
-                    ft.hide(fragment);
-                    button.setText("Show");
-                }
-                ft.commit();
-            }
-        });
-    }
-
-    public static class FirstFragment extends SherlockFragment {
-        TextView mTextView;
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.labeled_text_edit, container, false);
-            View tv = v.findViewById(R.id.msg);
-            ((TextView)tv).setText("The fragment saves and restores this text.");
-
-            // Retrieve the text editor, and restore the last saved state if needed.
-            mTextView = (TextView)v.findViewById(R.id.saved);
-            if (savedInstanceState != null) {
-                mTextView.setText(savedInstanceState.getCharSequence("text"));
-            }
-            return v;
-        }
-
-        @Override
-        public void onSaveInstanceState(Bundle outState) {
-            super.onSaveInstanceState(outState);
-
-            // Remember the current text, to restore if we later restart.
-            outState.putCharSequence("text", mTextView.getText());
-        }
-    }
-
-    public static class SecondFragment extends Fragment {
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.labeled_text_edit, container, false);
-            View tv = v.findViewById(R.id.msg);
-            ((TextView)tv).setText("The TextView saves and restores this text.");
-
-            // Retrieve the text editor and tell it to save and restore its state.
-            // Note that you will often set this in the layout XML, but since
-            // we are sharing our layout with the other fragment we will customize
-            // it here.
-            ((TextView)v.findViewById(R.id.saved)).setSaveEnabled(true);
-            return v;
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentLayoutSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentLayoutSupport.java
deleted file mode 100644
index e3f6a92..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentLayoutSupport.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2010 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.actionbarsherlock.sample.fragments;
-
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.ScrollView;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-
-/**
- * Demonstration of using fragments to implement different activity layouts.
- * This sample provides a different layout (and activity flow) when run in
- * landscape.
- */
-public class FragmentLayoutSupport extends SherlockFragmentActivity {
-
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.fragment_layout_support);
-    }
-
-
-    /**
-     * This is a secondary activity, to show what the user has selected
-     * when the screen is not large enough to show it all in one activity.
-     */
-
-    public static class DetailsActivity extends SherlockFragmentActivity {
-
-        @Override
-        protected void onCreate(Bundle savedInstanceState) {
-            setTheme(SampleList.THEME); //Used for theme switching in samples
-            super.onCreate(savedInstanceState);
-
-            if (getResources().getConfiguration().orientation
-                    == Configuration.ORIENTATION_LANDSCAPE) {
-                // If the screen is now in landscape mode, we can show the
-                // dialog in-line with the list so we don't need this activity.
-                finish();
-                return;
-            }
-
-            if (savedInstanceState == null) {
-                // During initial setup, plug in the details fragment.
-                DetailsFragment details = new DetailsFragment();
-                details.setArguments(getIntent().getExtras());
-                getSupportFragmentManager().beginTransaction().add(
-                        android.R.id.content, details).commit();
-            }
-        }
-    }
-
-
-    /**
-     * This is the "top-level" fragment, showing a list of items that the
-     * user can pick.  Upon picking an item, it takes care of displaying the
-     * data to the user as appropriate based on the currrent UI layout.
-     */
-
-    public static class TitlesFragment extends SherlockListFragment {
-        boolean mDualPane;
-        int mCurCheckPosition = 0;
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-
-            // Populate list with our static array of titles.
-            setListAdapter(new ArrayAdapter<String>(getActivity(),
-                    R.layout.simple_list_item_checkable_1,
-                    android.R.id.text1, Shakespeare.TITLES));
-
-            // Check to see if we have a frame in which to embed the details
-            // fragment directly in the containing UI.
-            View detailsFrame = getActivity().findViewById(R.id.details);
-            mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
-
-            if (savedInstanceState != null) {
-                // Restore last state for checked position.
-                mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
-            }
-
-            if (mDualPane) {
-                // In dual-pane mode, the list view highlights the selected item.
-                getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-                // Make sure our UI is in the correct state.
-                showDetails(mCurCheckPosition);
-            }
-        }
-
-        @Override
-        public void onSaveInstanceState(Bundle outState) {
-            super.onSaveInstanceState(outState);
-            outState.putInt("curChoice", mCurCheckPosition);
-        }
-
-        @Override
-        public void onListItemClick(ListView l, View v, int position, long id) {
-            showDetails(position);
-        }
-
-        /**
-         * Helper function to show the details of a selected item, either by
-         * displaying a fragment in-place in the current UI, or starting a
-         * whole new activity in which it is displayed.
-         */
-        void showDetails(int index) {
-            mCurCheckPosition = index;
-
-            if (mDualPane) {
-                // We can display everything in-place with fragments, so update
-                // the list to highlight the selected item and show the data.
-                getListView().setItemChecked(index, true);
-
-                // Check what fragment is currently shown, replace if needed.
-                DetailsFragment details = (DetailsFragment)
-                        getFragmentManager().findFragmentById(R.id.details);
-                if (details == null || details.getShownIndex() != index) {
-                    // Make new fragment to show this selection.
-                    details = DetailsFragment.newInstance(index);
-
-                    // Execute a transaction, replacing any existing fragment
-                    // with this one inside the frame.
-                    FragmentTransaction ft = getFragmentManager().beginTransaction();
-                    ft.replace(R.id.details, details);
-                    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
-                    ft.commit();
-                }
-
-            } else {
-                // Otherwise we need to launch a new activity to display
-                // the dialog fragment with selected text.
-                Intent intent = new Intent();
-                intent.setClass(getActivity(), DetailsActivity.class);
-                intent.putExtra("index", index);
-                startActivity(intent);
-            }
-        }
-    }
-
-
-    /**
-     * This is the secondary fragment, displaying the details of a particular
-     * item.
-     */
-
-    public static class DetailsFragment extends SherlockFragment {
-        /**
-         * Create a new instance of DetailsFragment, initialized to
-         * show the text at 'index'.
-         */
-        public static DetailsFragment newInstance(int index) {
-            DetailsFragment f = new DetailsFragment();
-
-            // Supply index input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("index", index);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        public int getShownIndex() {
-            return getArguments().getInt("index", 0);
-        }
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            if (container == null) {
-                // We have different layouts, and in one of them this
-                // fragment's containing frame doesn't exist.  The fragment
-                // may still be created from its saved state, but there is
-                // no reason to try to create its view hierarchy because it
-                // won't be displayed.  Note this is not needed -- we could
-                // just run the code below, where we would create and return
-                // the view hierarchy; it would just never be used.
-                return null;
-            }
-
-            ScrollView scroller = new ScrollView(getActivity());
-            TextView text = new TextView(getActivity());
-            int padding = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
-                    4, getActivity().getResources().getDisplayMetrics());
-            text.setPadding(padding, padding, padding, padding);
-            scroller.addView(text);
-            text.setText(Shakespeare.DIALOGUE[getShownIndex()]);
-            return scroller;
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentListArraySupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentListArraySupport.java
deleted file mode 100644
index 9462375..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentListArraySupport.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.util.Log;
-import android.view.View;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-
-/**
- * Demonstration of using ListFragment to show a list of items
- * from a canned array.
- */
-public class FragmentListArraySupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        // Create the list fragment and add it as our sole content.
-        if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
-            ArrayListFragment list = new ArrayListFragment();
-            getSupportFragmentManager().beginTransaction().add(android.R.id.content, list).commit();
-        }
-    }
-
-    public static class ArrayListFragment extends SherlockListFragment {
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-            setListAdapter(new ArrayAdapter<String>(getActivity(),
-                    android.R.layout.simple_list_item_1, Shakespeare.TITLES));
-        }
-
-        @Override
-        public void onListItemClick(ListView l, View v, int position, long id) {
-            Log.i("FragmentList", "Item clicked: " + id);
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentMenuSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentMenuSupport.java
deleted file mode 100644
index 58c818d..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentMenuSupport.java
+++ /dev/null
@@ -1,132 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.CheckBox;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-
-/**
- * Demonstrates how fragments can participate in the options menu.
- */
-public class FragmentMenuSupport extends SherlockFragmentActivity {
-    Fragment mFragment1;
-    Fragment mFragment2;
-    CheckBox mCheckBox1;
-    CheckBox mCheckBox2;
-
-    // Update fragment visibility when check boxes are changed.
-    final OnClickListener mClickListener = new OnClickListener() {
-        public void onClick(View v) {
-            updateFragmentVisibility();
-        }
-    };
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_menu);
-
-        // Make sure the two menu fragments are created.
-        FragmentManager fm = getSupportFragmentManager();
-        FragmentTransaction ft = fm.beginTransaction();
-        mFragment1 = fm.findFragmentByTag("f1");
-        if (mFragment1 == null) {
-            mFragment1 = new MenuFragment();
-            ft.add(mFragment1, "f1");
-        }
-        mFragment2 = fm.findFragmentByTag("f2");
-        if (mFragment2 == null) {
-            mFragment2 = new Menu2Fragment();
-            ft.add(mFragment2, "f2");
-        }
-        ft.commit();
-
-        // Watch check box clicks.
-        mCheckBox1 = (CheckBox)findViewById(R.id.menu1);
-        mCheckBox1.setOnClickListener(mClickListener);
-        mCheckBox2 = (CheckBox)findViewById(R.id.menu2);
-        mCheckBox2.setOnClickListener(mClickListener);
-
-        // Make sure fragments start out with correct visibility.
-        updateFragmentVisibility();
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-        // Make sure fragments are updated after check box view state is restored.
-        updateFragmentVisibility();
-    }
-
-    // Update fragment visibility based on current check box state.
-    void updateFragmentVisibility() {
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-        if (mCheckBox1.isChecked()) ft.show(mFragment1);
-        else ft.hide(mFragment1);
-        if (mCheckBox2.isChecked()) ft.show(mFragment2);
-        else ft.hide(mFragment2);
-        ft.commit();
-    }
-
-    /**
-     * A fragment that displays a menu.  This fragment happens to not
-     * have a UI (it does not implement onCreateView), but it could also
-     * have one if it wanted.
-     */
-    public static class MenuFragment extends SherlockFragment {
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            setHasOptionsMenu(true);
-        }
-
-        @Override
-        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-            menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-            menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-        }
-    }
-
-    /**
-     * Second fragment with a menu.
-     */
-    public static class Menu2Fragment extends SherlockFragment {
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            setHasOptionsMenu(true);
-        }
-
-        @Override
-        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-            menu.add("Menu 2").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentPagerSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentPagerSupport.java
deleted file mode 100644
index a531b15..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentPagerSupport.java
+++ /dev/null
@@ -1,139 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.ListView;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-
-
-public class FragmentPagerSupport extends SherlockFragmentActivity {
-    static final int NUM_ITEMS = 10;
-
-    MyAdapter mAdapter;
-
-    ViewPager mPager;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_pager);
-
-        mAdapter = new MyAdapter(getSupportFragmentManager());
-
-        mPager = (ViewPager)findViewById(R.id.pager);
-        mPager.setAdapter(mAdapter);
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.goto_first);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                mPager.setCurrentItem(0);
-            }
-        });
-        button = (Button)findViewById(R.id.goto_last);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                mPager.setCurrentItem(NUM_ITEMS-1);
-            }
-        });
-    }
-
-    public static class MyAdapter extends FragmentPagerAdapter {
-        public MyAdapter(FragmentManager fm) {
-            super(fm);
-        }
-
-        @Override
-        public int getCount() {
-            return NUM_ITEMS;
-        }
-
-        @Override
-        public Fragment getItem(int position) {
-            return ArrayListFragment.newInstance(position);
-        }
-    }
-
-    public static class ArrayListFragment extends SherlockListFragment {
-        int mNum;
-
-        /**
-         * Create a new instance of CountingFragment, providing "num"
-         * as an argument.
-         */
-        static ArrayListFragment newInstance(int num) {
-            ArrayListFragment f = new ArrayListFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        /**
-         * When creating, retrieve this instance's number from its arguments.
-         */
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
-        }
-
-        /**
-         * The Fragment's UI is just a simple text view showing its
-         * instance number.
-         */
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText("Fragment #" + mNum);
-            return v;
-        }
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-            setListAdapter(new ArrayAdapter<String>(getActivity(),
-                    android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
-        }
-
-        @Override
-        public void onListItemClick(ListView l, View v, int position, long id) {
-            Log.i("FragmentList", "Item clicked: " + id);
-        }
-    }
-}
-
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentReceiveResultSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentReceiveResultSupport.java
deleted file mode 100644
index fda6d1c..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentReceiveResultSupport.java
+++ /dev/null
@@ -1,133 +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.actionbarsherlock.sample.fragments;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.text.Editable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-public class FragmentReceiveResultSupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT,
-                ViewGroup.LayoutParams.FILL_PARENT);
-        FrameLayout frame = new FrameLayout(this);
-        frame.setId(R.id.simple_fragment);
-        setContentView(frame, lp);
-
-        if (savedInstanceState == null) {
-            // Do first time initialization -- add fragment.
-            Fragment newFragment = new ReceiveResultFragment();
-            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-            ft.add(R.id.simple_fragment, newFragment).commit();
-        }
-    }
-
-    public static class ReceiveResultFragment extends SherlockFragment {
-        // Definition of the one requestCode we use for receiving resuls.
-        static final private int GET_CODE = 0;
-
-        private TextView mResults;
-
-        private OnClickListener mGetListener = new OnClickListener() {
-            public void onClick(View v) {
-                // Start the activity whose result we want to retrieve.  The
-                // result will come back with request code GET_CODE.
-                Intent intent = new Intent(getActivity(), SendResult.class);
-                startActivityForResult(intent, GET_CODE);
-            }
-        };
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-        }
-
-        @Override
-        public void onSaveInstanceState(Bundle outState) {
-            super.onSaveInstanceState(outState);
-        }
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.receive_result, container, false);
-
-            // Retrieve the TextView widget that will display results.
-            mResults = (TextView)v.findViewById(R.id.results);
-
-            // This allows us to later extend the text buffer.
-            mResults.setText(mResults.getText(), TextView.BufferType.EDITABLE);
-
-            // Watch for button clicks.
-            Button getButton = (Button)v.findViewById(R.id.get);
-            getButton.setOnClickListener(mGetListener);
-
-            return v;
-        }
-
-        /**
-         * This method is called when the sending activity has finished, with the
-         * result it supplied.
-         */
-        @Override
-        public void onActivityResult(int requestCode, int resultCode, Intent data) {
-            // You can use the requestCode to select between multiple child
-            // activities you may have started.  Here there is only one thing
-            // we launch.
-            if (requestCode == GET_CODE) {
-
-                // We will be adding to our text.
-                Editable text = (Editable)mResults.getText();
-
-                // This is a standard resultCode that is sent back if the
-                // activity doesn't supply an explicit result.  It will also
-                // be returned if the activity failed to launch.
-                if (resultCode == RESULT_CANCELED) {
-                    text.append("(cancelled)");
-
-                // Our protocol with the sending activity is that it will send
-                // text in 'data' as its result.
-                } else {
-                    text.append("(okay ");
-                    text.append(Integer.toString(resultCode));
-                    text.append(") ");
-                    if (data != null) {
-                        text.append(data.getAction());
-                    }
-                }
-
-                text.append("\n");
-            }
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentRetainInstanceSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentRetainInstanceSupport.java
deleted file mode 100644
index a6f5a73..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentRetainInstanceSupport.java
+++ /dev/null
@@ -1,231 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.ProgressBar;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * This example shows how you can use a Fragment to easily propagate state
- * (such as threads) across activity instances when an activity needs to be
- * restarted due to, for example, a configuration change.  This is a lot
- * easier than using the raw Activity.onRetainNonConfiguratinInstance() API.
- */
-public class FragmentRetainInstanceSupport extends SherlockFragmentActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        // First time init, create the UI.
-        if (savedInstanceState == null) {
-            getSupportFragmentManager().beginTransaction().add(android.R.id.content,
-                    new UiFragment()).commit();
-        }
-    }
-
-    /**
-     * This is a fragment showing UI that will be updated from work done
-     * in the retained fragment.
-     */
-    public static class UiFragment extends SherlockFragment {
-        RetainedFragment mWorkFragment;
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.fragment_retain_instance, container, false);
-
-            // Watch for button clicks.
-            Button button = (Button)v.findViewById(R.id.restart);
-            button.setOnClickListener(new OnClickListener() {
-                public void onClick(View v) {
-                    mWorkFragment.restart();
-                }
-            });
-
-            return v;
-        }
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-
-            FragmentManager fm = getFragmentManager();
-
-            // Check to see if we have retained the worker fragment.
-            mWorkFragment = (RetainedFragment)fm.findFragmentByTag("work");
-
-            // If not retained (or first time running), we need to create it.
-            if (mWorkFragment == null) {
-                mWorkFragment = new RetainedFragment();
-                // Tell it who it is working with.
-                mWorkFragment.setTargetFragment(this, 0);
-                fm.beginTransaction().add(mWorkFragment, "work").commit();
-            }
-        }
-
-    }
-
-    /**
-     * This is the Fragment implementation that will be retained across
-     * activity instances.  It represents some ongoing work, here a thread
-     * we have that sits around incrementing a progress indicator.
-     */
-    public static class RetainedFragment extends SherlockFragment {
-        ProgressBar mProgressBar;
-        int mPosition;
-        boolean mReady = false;
-        boolean mQuiting = false;
-
-        /**
-         * This is the thread that will do our work.  It sits in a loop running
-         * the progress up until it has reached the top, then stops and waits.
-         */
-        final Thread mThread = new Thread() {
-            @Override
-            public void run() {
-                // We'll figure the real value out later.
-                int max = 10000;
-
-                // This thread runs almost forever.
-                while (true) {
-
-                    // Update our shared state with the UI.
-                    synchronized (this) {
-                        // Our thread is stopped if the UI is not ready
-                        // or it has completed its work.
-                        while (!mReady || mPosition >= max) {
-                            if (mQuiting) {
-                                return;
-                            }
-                            try {
-                                wait();
-                            } catch (InterruptedException e) {
-                            }
-                        }
-
-                        // Now update the progress.  Note it is important that
-                        // we touch the progress bar with the lock held, so it
-                        // doesn't disappear on us.
-                        mPosition++;
-                        max = mProgressBar.getMax();
-                        mProgressBar.setProgress(mPosition);
-                    }
-
-                    // Normally we would be doing some work, but put a kludge
-                    // here to pretend like we are.
-                    synchronized (this) {
-                        try {
-                            wait(50);
-                        } catch (InterruptedException e) {
-                        }
-                    }
-                }
-            }
-        };
-
-        /**
-         * Fragment initialization.  We way we want to be retained and
-         * start our thread.
-         */
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            // Tell the framework to try to keep this fragment around
-            // during a configuration change.
-            setRetainInstance(true);
-
-            // Start up the worker thread.
-            mThread.start();
-        }
-
-        /**
-         * This is called when the Fragment's Activity is ready to go, after
-         * its content view has been installed; it is called both after
-         * the initial fragment creation and after the fragment is re-attached
-         * to a new activity.
-         */
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-
-            // Retrieve the progress bar from the target's view hierarchy.
-            mProgressBar = (ProgressBar)getTargetFragment().getView().findViewById(
-                    R.id.progress_horizontal);
-
-            // We are ready for our thread to go.
-            synchronized (mThread) {
-                mReady = true;
-                mThread.notify();
-            }
-        }
-
-        /**
-         * This is called when the fragment is going away.  It is NOT called
-         * when the fragment is being propagated between activity instances.
-         */
-        @Override
-        public void onDestroy() {
-            // Make the thread go away.
-            synchronized (mThread) {
-                mReady = false;
-                mQuiting = true;
-                mThread.notify();
-            }
-
-            super.onDestroy();
-        }
-
-        /**
-         * This is called right before the fragment is detached from its
-         * current activity instance.
-         */
-        @Override
-        public void onDetach() {
-            // This fragment is being detached from its activity.  We need
-            // to make sure its thread is not going to touch any activity
-            // state after returning from this function.
-            synchronized (mThread) {
-                mProgressBar = null;
-                mReady = false;
-                mThread.notify();
-            }
-
-            super.onDetach();
-        }
-
-        /**
-         * API for our UI to restart the progress thread.
-         */
-        public void restart() {
-            synchronized (mThread) {
-                mPosition = 0;
-                mThread.notify();
-            }
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentStackSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentStackSupport.java
deleted file mode 100644
index 9e044a6..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentStackSupport.java
+++ /dev/null
@@ -1,124 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragment;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-public class FragmentStackSupport extends SherlockFragmentActivity {
-    int mStackLevel = 1;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_stack);
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.new_fragment);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                addFragmentToStack();
-            }
-        });
-
-        if (savedInstanceState == null) {
-            // Do first time initialization -- add initial fragment.
-            Fragment newFragment = CountingFragment.newInstance(mStackLevel);
-            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-            ft.add(R.id.simple_fragment, newFragment).commit();
-        } else {
-            mStackLevel = savedInstanceState.getInt("level");
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putInt("level", mStackLevel);
-    }
-
-
-    void addFragmentToStack() {
-        mStackLevel++;
-
-        // Instantiate a new fragment.
-        Fragment newFragment = CountingFragment.newInstance(mStackLevel);
-
-        // Add the fragment to the activity, pushing this transaction
-        // on to the back stack.
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-        ft.replace(R.id.simple_fragment, newFragment);
-        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
-        ft.addToBackStack(null);
-        ft.commit();
-    }
-
-
-
-    public static class CountingFragment extends SherlockFragment {
-        int mNum;
-
-        /**
-         * Create a new instance of CountingFragment, providing "num"
-         * as an argument.
-         */
-        static CountingFragment newInstance(int num) {
-            CountingFragment f = new CountingFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        /**
-         * When creating, retrieve this instance's number from its arguments.
-         */
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
-        }
-
-        /**
-         * The Fragment's UI is just a simple text view showing its
-         * instance number.
-         */
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.hello_world, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText("Fragment #" + mNum);
-            tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
-            return v;
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentStatePagerSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentStatePagerSupport.java
deleted file mode 100644
index 433c7e3..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentStatePagerSupport.java
+++ /dev/null
@@ -1,139 +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.actionbarsherlock.sample.fragments;
-
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentStatePagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.ListView;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-
-
-public class FragmentStatePagerSupport extends SherlockFragmentActivity {
-    static final int NUM_ITEMS = 10;
-
-    MyAdapter mAdapter;
-
-    ViewPager mPager;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fragment_pager);
-
-        mAdapter = new MyAdapter(getSupportFragmentManager());
-
-        mPager = (ViewPager)findViewById(R.id.pager);
-        mPager.setAdapter(mAdapter);
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.goto_first);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                mPager.setCurrentItem(0);
-            }
-        });
-        button = (Button)findViewById(R.id.goto_last);
-        button.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                mPager.setCurrentItem(NUM_ITEMS-1);
-            }
-        });
-    }
-
-    public static class MyAdapter extends FragmentStatePagerAdapter {
-        public MyAdapter(FragmentManager fm) {
-            super(fm);
-        }
-
-        @Override
-        public int getCount() {
-            return NUM_ITEMS;
-        }
-
-        @Override
-        public Fragment getItem(int position) {
-            return ArrayListFragment.newInstance(position);
-        }
-    }
-
-    public static class ArrayListFragment extends SherlockListFragment {
-        int mNum;
-
-        /**
-         * Create a new instance of CountingFragment, providing "num"
-         * as an argument.
-         */
-        static ArrayListFragment newInstance(int num) {
-            ArrayListFragment f = new ArrayListFragment();
-
-            // Supply num input as an argument.
-            Bundle args = new Bundle();
-            args.putInt("num", num);
-            f.setArguments(args);
-
-            return f;
-        }
-
-        /**
-         * When creating, retrieve this instance's number from its arguments.
-         */
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
-        }
-
-        /**
-         * The Fragment's UI is just a simple text view showing its
-         * instance number.
-         */
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            View v = inflater.inflate(R.layout.fragment_pager_list, container, false);
-            View tv = v.findViewById(R.id.text);
-            ((TextView)tv).setText("Fragment #" + mNum);
-            return v;
-        }
-
-        @Override
-        public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-            setListAdapter(new ArrayAdapter<String>(getActivity(),
-                    android.R.layout.simple_list_item_1, Cheeses.sCheeseStrings));
-        }
-
-        @Override
-        public void onListItemClick(ListView l, View v, int position, long id) {
-            Log.i("FragmentList", "Item clicked: " + id);
-        }
-    }
-}
-
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabs.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabs.java
deleted file mode 100644
index e6dbd94..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabs.java
+++ /dev/null
@@ -1,170 +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.actionbarsherlock.sample.fragments;
-
-
-import java.util.HashMap;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentTransaction;
-import android.view.View;
-import android.widget.TabHost;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * This demonstrates how you can implement switching between the tabs of a
- * TabHost through fragments.  It uses a trick (see the code below) to allow
- * the tabs to switch between fragments instead of simple views.
- */
-public class FragmentTabs extends SherlockFragmentActivity {
-    TabHost mTabHost;
-    TabManager mTabManager;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.fragment_tabs);
-        mTabHost = (TabHost)findViewById(android.R.id.tabhost);
-        mTabHost.setup();
-
-        mTabManager = new TabManager(this, mTabHost, R.id.realtabcontent);
-
-        mTabManager.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
-                FragmentStackSupport.CountingFragment.class, null);
-        mTabManager.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
-                LoaderCursorSupport.CursorLoaderListFragment.class, null);
-        mTabManager.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
-                LoaderCustomSupport.AppListFragment.class, null);
-        mTabManager.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
-                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
-
-        if (savedInstanceState != null) {
-            mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
-        }
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putString("tab", mTabHost.getCurrentTabTag());
-    }
-
-    /**
-     * This is a helper class that implements a generic mechanism for
-     * associating fragments with the tabs in a tab host.  It relies on a
-     * trick.  Normally a tab host has a simple API for supplying a View or
-     * Intent that each tab will show.  This is not sufficient for switching
-     * between fragments.  So instead we make the content part of the tab host
-     * 0dp high (it is not shown) and the TabManager supplies its own dummy
-     * view to show as the tab content.  It listens to changes in tabs, and takes
-     * care of switch to the correct fragment shown in a separate content area
-     * whenever the selected tab changes.
-     */
-    public static class TabManager implements TabHost.OnTabChangeListener {
-        private final FragmentActivity mActivity;
-        private final TabHost mTabHost;
-        private final int mContainerId;
-        private final HashMap<String, TabInfo> mTabs = new HashMap<String, TabInfo>();
-        TabInfo mLastTab;
-
-        static final class TabInfo {
-            private final String tag;
-            private final Class<?> clss;
-            private final Bundle args;
-            private Fragment fragment;
-
-            TabInfo(String _tag, Class<?> _class, Bundle _args) {
-                tag = _tag;
-                clss = _class;
-                args = _args;
-            }
-        }
-
-        static class DummyTabFactory implements TabHost.TabContentFactory {
-            private final Context mContext;
-
-            public DummyTabFactory(Context context) {
-                mContext = context;
-            }
-
-            @Override
-            public View createTabContent(String tag) {
-                View v = new View(mContext);
-                v.setMinimumWidth(0);
-                v.setMinimumHeight(0);
-                return v;
-            }
-        }
-
-        public TabManager(FragmentActivity activity, TabHost tabHost, int containerId) {
-            mActivity = activity;
-            mTabHost = tabHost;
-            mContainerId = containerId;
-            mTabHost.setOnTabChangedListener(this);
-        }
-
-        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
-            tabSpec.setContent(new DummyTabFactory(mActivity));
-            String tag = tabSpec.getTag();
-
-            TabInfo info = new TabInfo(tag, clss, args);
-
-            // Check to see if we already have a fragment for this tab, probably
-            // from a previously saved state.  If so, deactivate it, because our
-            // initial state is that a tab isn't shown.
-            info.fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);
-            if (info.fragment != null && !info.fragment.isDetached()) {
-                FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
-                ft.detach(info.fragment);
-                ft.commit();
-            }
-
-            mTabs.put(tag, info);
-            mTabHost.addTab(tabSpec);
-        }
-
-        @Override
-        public void onTabChanged(String tabId) {
-            TabInfo newTab = mTabs.get(tabId);
-            if (mLastTab != newTab) {
-                FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
-                if (mLastTab != null) {
-                    if (mLastTab.fragment != null) {
-                        ft.detach(mLastTab.fragment);
-                    }
-                }
-                if (newTab != null) {
-                    if (newTab.fragment == null) {
-                        newTab.fragment = Fragment.instantiate(mActivity,
-                                newTab.clss.getName(), newTab.args);
-                        ft.add(mContainerId, newTab.fragment, newTab.tag);
-                    } else {
-                        ft.attach(newTab.fragment);
-                    }
-                }
-
-                mLastTab = newTab;
-                ft.commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        }
-    }
-}
-
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabsPager.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabsPager.java
deleted file mode 100644
index d50092f..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabsPager.java
+++ /dev/null
@@ -1,179 +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.actionbarsherlock.sample.fragments;
-
-import java.util.ArrayList;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TabHost;
-import android.widget.TabWidget;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-
-/**
- * Demonstrates combining a TabHost with a ViewPager to implement a tab UI
- * that switches between tabs and also allows the user to perform horizontal
- * flicks to move between the tabs.
- */
-public class FragmentTabsPager extends SherlockFragmentActivity {
-    TabHost mTabHost;
-    ViewPager  mViewPager;
-    TabsAdapter mTabsAdapter;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.fragment_tabs_pager);
-        mTabHost = (TabHost)findViewById(android.R.id.tabhost);
-        mTabHost.setup();
-
-        mViewPager = (ViewPager)findViewById(R.id.pager);
-
-        mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
-
-        mTabsAdapter.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
-                FragmentStackSupport.CountingFragment.class, null);
-        mTabsAdapter.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
-                LoaderCursorSupport.CursorLoaderListFragment.class, null);
-        mTabsAdapter.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
-                LoaderCustomSupport.AppListFragment.class, null);
-        mTabsAdapter.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
-                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
-
-        if (savedInstanceState != null) {
-            mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
-        }
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putString("tab", mTabHost.getCurrentTabTag());
-    }
-
-    /**
-     * This is a helper class that implements the management of tabs and all
-     * details of connecting a ViewPager with associated TabHost.  It relies on a
-     * trick.  Normally a tab host has a simple API for supplying a View or
-     * Intent that each tab will show.  This is not sufficient for switching
-     * between pages.  So instead we make the content part of the tab host
-     * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
-     * view to show as the tab content.  It listens to changes in tabs, and takes
-     * care of switch to the correct paged in the ViewPager whenever the selected
-     * tab changes.
-     */
-    public static class TabsAdapter extends FragmentPagerAdapter
-            implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener {
-        private final Context mContext;
-        private final TabHost mTabHost;
-        private final ViewPager mViewPager;
-        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
-
-        static final class TabInfo {
-            private final String tag;
-            private final Class<?> clss;
-            private final Bundle args;
-
-            TabInfo(String _tag, Class<?> _class, Bundle _args) {
-                tag = _tag;
-                clss = _class;
-                args = _args;
-            }
-        }
-
-        static class DummyTabFactory implements TabHost.TabContentFactory {
-            private final Context mContext;
-
-            public DummyTabFactory(Context context) {
-                mContext = context;
-            }
-
-            @Override
-            public View createTabContent(String tag) {
-                View v = new View(mContext);
-                v.setMinimumWidth(0);
-                v.setMinimumHeight(0);
-                return v;
-            }
-        }
-
-        public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) {
-            super(activity.getSupportFragmentManager());
-            mContext = activity;
-            mTabHost = tabHost;
-            mViewPager = pager;
-            mTabHost.setOnTabChangedListener(this);
-            mViewPager.setAdapter(this);
-            mViewPager.setOnPageChangeListener(this);
-        }
-
-        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
-            tabSpec.setContent(new DummyTabFactory(mContext));
-            String tag = tabSpec.getTag();
-
-            TabInfo info = new TabInfo(tag, clss, args);
-            mTabs.add(info);
-            mTabHost.addTab(tabSpec);
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public int getCount() {
-            return mTabs.size();
-        }
-
-        @Override
-        public Fragment getItem(int position) {
-            TabInfo info = mTabs.get(position);
-            return Fragment.instantiate(mContext, info.clss.getName(), info.args);
-        }
-
-        @Override
-        public void onTabChanged(String tabId) {
-            int position = mTabHost.getCurrentTab();
-            mViewPager.setCurrentItem(position);
-        }
-
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            // Unfortunately when TabHost changes the current tab, it kindly
-            // also takes care of putting focus on it when not in touch mode.
-            // The jerk.
-            // This hack tries to prevent this from pulling focus out of our
-            // ViewPager.
-            TabWidget widget = mTabHost.getTabWidget();
-            int oldFocusability = widget.getDescendantFocusability();
-            widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
-            mTabHost.setCurrentTab(position);
-            widget.setDescendantFocusability(oldFocusability);
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-        }
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderCursorSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderCursorSupport.java
deleted file mode 100644
index e465a2b..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderCursorSupport.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2010 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.actionbarsherlock.sample.fragments;
-
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.provider.Contacts.People;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.support.v4.widget.SearchViewCompat;
-import android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat;
-import android.support.v4.widget.SimpleCursorAdapter;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.ListView;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-
-/**
- * Demonstration of the use of a CursorLoader to load and display contacts
- * data in a fragment.
- */
-@SuppressWarnings("all")
-public class LoaderCursorSupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        FragmentManager fm = getSupportFragmentManager();
-
-        // Create the list fragment and add it as our sole content.
-        if (fm.findFragmentById(android.R.id.content) == null) {
-            CursorLoaderListFragment list = new CursorLoaderListFragment();
-            fm.beginTransaction().add(android.R.id.content, list).commit();
-        }
-    }
-
-
-    public static class CursorLoaderListFragment extends SherlockListFragment
-            implements LoaderManager.LoaderCallbacks<Cursor> {
-
-        // This is the Adapter being used to display the list's data.
-        SimpleCursorAdapter mAdapter;
-
-        // If non-null, this is the current filter the user has provided.
-        String mCurFilter;
-
-        @Override public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-
-            // Give some text to display if there is no data.  In a real
-            // application this would come from a resource.
-            setEmptyText("No phone numbers");
-
-            // We have a menu item to show in action bar.
-            setHasOptionsMenu(true);
-
-            // Create an empty adapter we will use to display the loaded data.
-            mAdapter = new SimpleCursorAdapter(getActivity(),
-                    android.R.layout.simple_list_item_1, null,
-                    new String[] { People.DISPLAY_NAME },
-                    new int[] { android.R.id.text1}, 0);
-            setListAdapter(mAdapter);
-
-            // Start out with a progress indicator.
-            setListShown(false);
-
-            // Prepare the loader.  Either re-connect with an existing one,
-            // or start a new one.
-            getLoaderManager().initLoader(0, null, this);
-        }
-
-        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-            // Place an action bar item for searching.
-            MenuItem item = menu.add("Search");
-            item.setIcon(android.R.drawable.ic_menu_search);
-            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
-            View searchView = SearchViewCompat.newSearchView(getActivity());
-            if (searchView != null) {
-                SearchViewCompat.setOnQueryTextListener(searchView,
-                        new OnQueryTextListenerCompat() {
-                    @Override
-                    public boolean onQueryTextChange(String newText) {
-                        // Called when the action bar search text has changed.  Update
-                        // the search filter, and restart the loader to do a new query
-                        // with this filter.
-                        mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
-                        getLoaderManager().restartLoader(0, null, CursorLoaderListFragment.this);
-                        return true;
-                    }
-                });
-                item.setActionView(searchView);
-            }
-        }
-
-        @Override public void onListItemClick(ListView l, View v, int position, long id) {
-            // Insert desired behavior here.
-            Log.i("FragmentComplexList", "Item clicked: " + id);
-        }
-
-        // These are the Contacts rows that we will retrieve.
-        static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
-            People._ID,
-            People.DISPLAY_NAME,
-        };
-
-        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-            // This is called when a new Loader needs to be created.  This
-            // sample only has one Loader, so we don't care about the ID.
-            // First, pick the base URI to use depending on whether we are
-            // currently filtering.
-            Uri baseUri;
-            if (mCurFilter != null) {
-                baseUri = Uri.withAppendedPath(People.CONTENT_FILTER_URI, Uri.encode(mCurFilter));
-            } else {
-                baseUri = People.CONTENT_URI;
-            }
-
-            // Now create and return a CursorLoader that will take care of
-            // creating a Cursor for the data being displayed.
-            String select = "((" + People.DISPLAY_NAME + " NOTNULL) AND ("
-                    + People.DISPLAY_NAME + " != '' ))";
-            return new CursorLoader(getActivity(), baseUri,
-                    CONTACTS_SUMMARY_PROJECTION, select, null,
-                    People.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
-        }
-
-        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-            // Swap the new cursor in.  (The framework will take care of closing the
-            // old cursor once we return.)
-            mAdapter.swapCursor(data);
-
-            // The list should now be shown.
-            if (isResumed()) {
-                setListShown(true);
-            } else {
-                setListShownNoAnimation(true);
-            }
-        }
-
-        public void onLoaderReset(Loader<Cursor> loader) {
-            // This is called when the last Cursor provided to onLoadFinished()
-            // above is about to be closed.  We need to make sure we are no
-            // longer using it.
-            mAdapter.swapCursor(null);
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderCustomSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderCustomSupport.java
deleted file mode 100644
index e1852cd..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderCustomSupport.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Copyright (C) 2010 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.actionbarsherlock.sample.fragments;
-
-import java.io.File;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.AsyncTaskLoader;
-import android.support.v4.content.IntentCompat;
-import android.support.v4.content.Loader;
-import android.support.v4.content.pm.ActivityInfoCompat;
-import android.support.v4.widget.SearchViewCompat;
-import android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TextView;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-
-/**
- * Demonstration of the implementation of a custom Loader.
- */
-public class LoaderCustomSupport extends SherlockFragmentActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        FragmentManager fm = getSupportFragmentManager();
-
-        // Create the list fragment and add it as our sole content.
-        if (fm.findFragmentById(android.R.id.content) == null) {
-            AppListFragment list = new AppListFragment();
-            fm.beginTransaction().add(android.R.id.content, list).commit();
-        }
-    }
-
-
-    /**
-     * This class holds the per-item data in our Loader.
-     */
-    public static class AppEntry {
-        public AppEntry(AppListLoader loader, ApplicationInfo info) {
-            mLoader = loader;
-            mInfo = info;
-            mApkFile = new File(info.sourceDir);
-        }
-
-        public ApplicationInfo getApplicationInfo() {
-            return mInfo;
-        }
-
-        public String getLabel() {
-            return mLabel;
-        }
-
-        public Drawable getIcon() {
-            if (mIcon == null) {
-                if (mApkFile.exists()) {
-                    mIcon = mInfo.loadIcon(mLoader.mPm);
-                    return mIcon;
-                } else {
-                    mMounted = false;
-                }
-            } else if (!mMounted) {
-                // If the app wasn't mounted but is now mounted, reload
-                // its icon.
-                if (mApkFile.exists()) {
-                    mMounted = true;
-                    mIcon = mInfo.loadIcon(mLoader.mPm);
-                    return mIcon;
-                }
-            } else {
-                return mIcon;
-            }
-
-            return mLoader.getContext().getResources().getDrawable(
-                    android.R.drawable.sym_def_app_icon);
-        }
-
-        @Override public String toString() {
-            return mLabel;
-        }
-
-        void loadLabel(Context context) {
-            if (mLabel == null || !mMounted) {
-                if (!mApkFile.exists()) {
-                    mMounted = false;
-                    mLabel = mInfo.packageName;
-                } else {
-                    mMounted = true;
-                    CharSequence label = mInfo.loadLabel(context.getPackageManager());
-                    mLabel = label != null ? label.toString() : mInfo.packageName;
-                }
-            }
-        }
-
-        private final AppListLoader mLoader;
-        private final ApplicationInfo mInfo;
-        private final File mApkFile;
-        private String mLabel;
-        private Drawable mIcon;
-        private boolean mMounted;
-    }
-
-    /**
-     * Perform alphabetical comparison of application entry objects.
-     */
-    public static final Comparator<AppEntry> ALPHA_COMPARATOR = new Comparator<AppEntry>() {
-        private final Collator sCollator = Collator.getInstance();
-        @Override
-        public int compare(AppEntry object1, AppEntry object2) {
-            return sCollator.compare(object1.getLabel(), object2.getLabel());
-        }
-    };
-
-    /**
-     * Helper for determining if the configuration has changed in an interesting
-     * way so we need to rebuild the app list.
-     */
-    public static class InterestingConfigChanges {
-        final Configuration mLastConfiguration = new Configuration();
-        int mLastDensity;
-
-        boolean applyNewConfig(Resources res) {
-            int configChanges = mLastConfiguration.updateFrom(res.getConfiguration());
-            boolean densityChanged = mLastDensity != res.getDisplayMetrics().densityDpi;
-            if (densityChanged || (configChanges&(ActivityInfo.CONFIG_LOCALE
-                    |ActivityInfoCompat.CONFIG_UI_MODE|ActivityInfo.CONFIG_SCREEN_LAYOUT)) != 0) {
-                mLastDensity = res.getDisplayMetrics().densityDpi;
-                return true;
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Helper class to look for interesting changes to the installed apps
-     * so that the loader can be updated.
-     */
-    public static class PackageIntentReceiver extends BroadcastReceiver {
-        final AppListLoader mLoader;
-
-        public PackageIntentReceiver(AppListLoader loader) {
-            mLoader = loader;
-            IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
-            filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
-            filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
-            filter.addDataScheme("package");
-            mLoader.getContext().registerReceiver(this, filter);
-            // Register for events related to sdcard installation.
-            IntentFilter sdFilter = new IntentFilter();
-            sdFilter.addAction(IntentCompat.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
-            sdFilter.addAction(IntentCompat.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
-            mLoader.getContext().registerReceiver(this, sdFilter);
-        }
-
-        @Override public void onReceive(Context context, Intent intent) {
-            // Tell the loader about the change.
-            mLoader.onContentChanged();
-        }
-    }
-
-    /**
-     * A custom Loader that loads all of the installed applications.
-     */
-    public static class AppListLoader extends AsyncTaskLoader<List<AppEntry>> {
-        final InterestingConfigChanges mLastConfig = new InterestingConfigChanges();
-        final PackageManager mPm;
-
-        List<AppEntry> mApps;
-        PackageIntentReceiver mPackageObserver;
-
-        public AppListLoader(Context context) {
-            super(context);
-
-            // Retrieve the package manager for later use; note we don't
-            // use 'context' directly but instead the save global application
-            // context returned by getContext().
-            mPm = getContext().getPackageManager();
-        }
-
-        /**
-         * This is where the bulk of our work is done.  This function is
-         * called in a background thread and should generate a new set of
-         * data to be published by the loader.
-         */
-        @Override public List<AppEntry> loadInBackground() {
-            // Retrieve all known applications.
-            List<ApplicationInfo> apps = mPm.getInstalledApplications(
-                    PackageManager.GET_UNINSTALLED_PACKAGES |
-                    PackageManager.GET_DISABLED_COMPONENTS);
-            if (apps == null) {
-                apps = new ArrayList<ApplicationInfo>();
-            }
-
-            final Context context = getContext();
-
-            // Create corresponding array of entries and load their labels.
-            List<AppEntry> entries = new ArrayList<AppEntry>(apps.size());
-            for (int i=0; i<apps.size(); i++) {
-                AppEntry entry = new AppEntry(this, apps.get(i));
-                entry.loadLabel(context);
-                entries.add(entry);
-            }
-
-            // Sort the list.
-            Collections.sort(entries, ALPHA_COMPARATOR);
-
-            // Done!
-            return entries;
-        }
-
-        /**
-         * Called when there is new data to deliver to the client.  The
-         * super class will take care of delivering it; the implementation
-         * here just adds a little more logic.
-         */
-        @Override public void deliverResult(List<AppEntry> apps) {
-            if (isReset()) {
-                // An async query came in while the loader is stopped.  We
-                // don't need the result.
-                if (apps != null) {
-                    onReleaseResources(apps);
-                }
-            }
-            List<AppEntry> oldApps = apps;
-            mApps = apps;
-
-            if (isStarted()) {
-                // If the Loader is currently started, we can immediately
-                // deliver its results.
-                super.deliverResult(apps);
-            }
-
-            // At this point we can release the resources associated with
-            // 'oldApps' if needed; now that the new result is delivered we
-            // know that it is no longer in use.
-            if (oldApps != null) {
-                onReleaseResources(oldApps);
-            }
-        }
-
-        /**
-         * Handles a request to start the Loader.
-         */
-        @Override protected void onStartLoading() {
-            if (mApps != null) {
-                // If we currently have a result available, deliver it
-                // immediately.
-                deliverResult(mApps);
-            }
-
-            // Start watching for changes in the app data.
-            if (mPackageObserver == null) {
-                mPackageObserver = new PackageIntentReceiver(this);
-            }
-
-            // Has something interesting in the configuration changed since we
-            // last built the app list?
-            boolean configChange = mLastConfig.applyNewConfig(getContext().getResources());
-
-            if (takeContentChanged() || mApps == null || configChange) {
-                // If the data has changed since the last time it was loaded
-                // or is not currently available, start a load.
-                forceLoad();
-            }
-        }
-
-        /**
-         * Handles a request to stop the Loader.
-         */
-        @Override protected void onStopLoading() {
-            // Attempt to cancel the current load task if possible.
-            cancelLoad();
-        }
-
-        /**
-         * Handles a request to cancel a load.
-         */
-        @Override public void onCanceled(List<AppEntry> apps) {
-            super.onCanceled(apps);
-
-            // At this point we can release the resources associated with 'apps'
-            // if needed.
-            onReleaseResources(apps);
-        }
-
-        /**
-         * Handles a request to completely reset the Loader.
-         */
-        @Override protected void onReset() {
-            super.onReset();
-
-            // Ensure the loader is stopped
-            onStopLoading();
-
-            // At this point we can release the resources associated with 'apps'
-            // if needed.
-            if (mApps != null) {
-                onReleaseResources(mApps);
-                mApps = null;
-            }
-
-            // Stop monitoring for changes.
-            if (mPackageObserver != null) {
-                getContext().unregisterReceiver(mPackageObserver);
-                mPackageObserver = null;
-            }
-        }
-
-        /**
-         * Helper function to take care of releasing resources associated
-         * with an actively loaded data set.
-         */
-        protected void onReleaseResources(List<AppEntry> apps) {
-            // For a simple List<> there is nothing to do.  For something
-            // like a Cursor, we would close it here.
-        }
-    }
-
-
-
-    public static class AppListAdapter extends ArrayAdapter<AppEntry> {
-        private final LayoutInflater mInflater;
-
-        public AppListAdapter(Context context) {
-            super(context, android.R.layout.simple_list_item_2);
-            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        }
-
-        public void setData(List<AppEntry> data) {
-            clear();
-            if (data != null) {
-                for (AppEntry appEntry : data) {
-                    add(appEntry);
-                }
-            }
-        }
-
-        /**
-         * Populate new items in the list.
-         */
-        @Override public View getView(int position, View convertView, ViewGroup parent) {
-            View view;
-
-            if (convertView == null) {
-                view = mInflater.inflate(R.layout.list_item_icon_text, parent, false);
-            } else {
-                view = convertView;
-            }
-
-            AppEntry item = getItem(position);
-            ((ImageView)view.findViewById(R.id.icon)).setImageDrawable(item.getIcon());
-            ((TextView)view.findViewById(R.id.text)).setText(item.getLabel());
-
-            return view;
-        }
-    }
-
-    public static class AppListFragment extends SherlockListFragment
-            implements LoaderManager.LoaderCallbacks<List<AppEntry>> {
-
-        // This is the Adapter being used to display the list's data.
-        AppListAdapter mAdapter;
-
-        // If non-null, this is the current filter the user has provided.
-        String mCurFilter;
-
-        OnQueryTextListenerCompat mOnQueryTextListenerCompat;
-
-        @Override public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-
-            // Give some text to display if there is no data.  In a real
-            // application this would come from a resource.
-            setEmptyText("No applications");
-
-            // We have a menu item to show in action bar.
-            setHasOptionsMenu(true);
-
-            // Create an empty adapter we will use to display the loaded data.
-            mAdapter = new AppListAdapter(getActivity());
-            setListAdapter(mAdapter);
-
-            // Start out with a progress indicator.
-            setListShown(false);
-
-            // Prepare the loader.  Either re-connect with an existing one,
-            // or start a new one.
-            getLoaderManager().initLoader(0, null, this);
-        }
-
-        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-            // Place an action bar item for searching.
-            MenuItem item = menu.add("Search");
-            item.setIcon(android.R.drawable.ic_menu_search);
-            item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-            View searchView = SearchViewCompat.newSearchView(getActivity());
-            if (searchView != null) {
-                SearchViewCompat.setOnQueryTextListener(searchView,
-                        new OnQueryTextListenerCompat() {
-                    @Override
-                    public boolean onQueryTextChange(String newText) {
-                        // Called when the action bar search text has changed.  Since this
-                        // is a simple array adapter, we can just have it do the filtering.
-                        mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
-                        mAdapter.getFilter().filter(mCurFilter);
-                        return true;
-                    }
-                });
-                item.setActionView(searchView);
-            }
-        }
-
-        @Override public void onListItemClick(ListView l, View v, int position, long id) {
-            // Insert desired behavior here.
-            Log.i("LoaderCustom", "Item clicked: " + id);
-        }
-
-        @Override public Loader<List<AppEntry>> onCreateLoader(int id, Bundle args) {
-            // This is called when a new Loader needs to be created.  This
-            // sample only has one Loader with no arguments, so it is simple.
-            return new AppListLoader(getActivity());
-        }
-
-        @Override public void onLoadFinished(Loader<List<AppEntry>> loader, List<AppEntry> data) {
-            // Set the new data in the adapter.
-            mAdapter.setData(data);
-
-            // The list should now be shown.
-            if (isResumed()) {
-                setListShown(true);
-            } else {
-                setListShownNoAnimation(true);
-            }
-        }
-
-        @Override public void onLoaderReset(Loader<List<AppEntry>> loader) {
-            // Clear the data in the adapter.
-            mAdapter.setData(null);
-        }
-    }
-
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderThrottleSupport.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderThrottleSupport.java
deleted file mode 100644
index 85dbd87..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/LoaderThrottleSupport.java
+++ /dev/null
@@ -1,510 +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.actionbarsherlock.sample.fragments;
-
-
-import java.util.HashMap;
-import android.content.ContentProvider;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.SQLException;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.provider.BaseColumns;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.LoaderManager;
-import android.support.v4.content.CursorLoader;
-import android.support.v4.content.Loader;
-import android.support.v4.database.DatabaseUtilsCompat;
-import android.support.v4.widget.SimpleCursorAdapter;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.ListView;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.app.SherlockListFragment;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-
-/**
- * Demonstration of bottom to top implementation of a content provider holding
- * structured data through displaying it in the UI, using throttling to reduce
- * the number of queries done when its data changes.
- */
-public class LoaderThrottleSupport extends SherlockFragmentActivity {
-    // Debugging.
-    static final String TAG = "LoaderThrottle";
-
-    /**
-     * The authority we use to get to our sample provider.
-     */
-    public static final String AUTHORITY = "com.example.android.apis.supportv4.app.LoaderThrottle";
-
-    /**
-     * Definition of the contract for the main table of our provider.
-     */
-    public static final class MainTable implements BaseColumns {
-
-        // This class cannot be instantiated
-        private MainTable() {}
-
-        /**
-         * The table name offered by this provider
-         */
-        public static final String TABLE_NAME = "main";
-
-        /**
-         * The content:// style URL for this table
-         */
-        public static final Uri CONTENT_URI =  Uri.parse("content://" + AUTHORITY + "/main");
-
-        /**
-         * The content URI base for a single row of data. Callers must
-         * append a numeric row id to this Uri to retrieve a row
-         */
-        public static final Uri CONTENT_ID_URI_BASE
-                = Uri.parse("content://" + AUTHORITY + "/main/");
-
-        /**
-         * The MIME type of {@link #CONTENT_URI}.
-         */
-        public static final String CONTENT_TYPE
-                = "vnd.android.cursor.dir/vnd.example.api-demos-throttle";
-
-        /**
-         * The MIME type of a {@link #CONTENT_URI} sub-directory of a single row.
-         */
-        public static final String CONTENT_ITEM_TYPE
-                = "vnd.android.cursor.item/vnd.example.api-demos-throttle";
-        /**
-         * The default sort order for this table
-         */
-        public static final String DEFAULT_SORT_ORDER = "data COLLATE LOCALIZED ASC";
-
-        /**
-         * Column name for the single column holding our data.
-         * <P>Type: TEXT</P>
-         */
-        public static final String COLUMN_NAME_DATA = "data";
-    }
-
-    /**
-     * This class helps open, create, and upgrade the database file.
-     */
-   static class DatabaseHelper extends SQLiteOpenHelper {
-
-       private static final String DATABASE_NAME = "loader_throttle.db";
-       private static final int DATABASE_VERSION = 2;
-
-       DatabaseHelper(Context context) {
-
-           // calls the super constructor, requesting the default cursor factory.
-           super(context, DATABASE_NAME, null, DATABASE_VERSION);
-       }
-
-       /**
-        *
-        * Creates the underlying database with table name and column names taken from the
-        * NotePad class.
-        */
-       @Override
-       public void onCreate(SQLiteDatabase db) {
-           db.execSQL("CREATE TABLE " + MainTable.TABLE_NAME + " ("
-                   + MainTable._ID + " INTEGER PRIMARY KEY,"
-                   + MainTable.COLUMN_NAME_DATA + " TEXT"
-                   + ");");
-       }
-
-       /**
-        *
-        * Demonstrates that the provider must consider what happens when the
-        * underlying datastore is changed. In this sample, the database is upgraded the database
-        * by destroying the existing data.
-        * A real application should upgrade the database in place.
-        */
-       @Override
-       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-
-           // Logs that the database is being upgraded
-           Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
-                   + newVersion + ", which will destroy all old data");
-
-           // Kills the table and existing data
-           db.execSQL("DROP TABLE IF EXISTS notes");
-
-           // Recreates the database with a new version
-           onCreate(db);
-       }
-   }
-
-    /**
-     * A very simple implementation of a content provider.
-     */
-    public static class SimpleProvider extends ContentProvider {
-        // A projection map used to select columns from the database
-        private final HashMap<String, String> mNotesProjectionMap;
-        // Uri matcher to decode incoming URIs.
-        private final UriMatcher mUriMatcher;
-
-        // The incoming URI matches the main table URI pattern
-        private static final int MAIN = 1;
-        // The incoming URI matches the main table row ID URI pattern
-        private static final int MAIN_ID = 2;
-
-        // Handle to a new DatabaseHelper.
-        private DatabaseHelper mOpenHelper;
-
-        /**
-         * Global provider initialization.
-         */
-        public SimpleProvider() {
-            // Create and initialize URI matcher.
-            mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-            mUriMatcher.addURI(AUTHORITY, MainTable.TABLE_NAME, MAIN);
-            mUriMatcher.addURI(AUTHORITY, MainTable.TABLE_NAME + "/#", MAIN_ID);
-
-            // Create and initialize projection map for all columns.  This is
-            // simply an identity mapping.
-            mNotesProjectionMap = new HashMap<String, String>();
-            mNotesProjectionMap.put(MainTable._ID, MainTable._ID);
-            mNotesProjectionMap.put(MainTable.COLUMN_NAME_DATA, MainTable.COLUMN_NAME_DATA);
-        }
-
-        /**
-         * Perform provider creation.
-         */
-        @Override
-        public boolean onCreate() {
-            mOpenHelper = new DatabaseHelper(getContext());
-            // Assumes that any failures will be reported by a thrown exception.
-            return true;
-        }
-
-        /**
-         * Handle incoming queries.
-         */
-        @Override
-        public Cursor query(Uri uri, String[] projection, String selection,
-                String[] selectionArgs, String sortOrder) {
-
-            // Constructs a new query builder and sets its table name
-            SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-            qb.setTables(MainTable.TABLE_NAME);
-
-            switch (mUriMatcher.match(uri)) {
-                case MAIN:
-                    // If the incoming URI is for main table.
-                    qb.setProjectionMap(mNotesProjectionMap);
-                    break;
-
-                case MAIN_ID:
-                    // The incoming URI is for a single row.
-                    qb.setProjectionMap(mNotesProjectionMap);
-                    qb.appendWhere(MainTable._ID + "=?");
-                    selectionArgs = DatabaseUtilsCompat.appendSelectionArgs(selectionArgs,
-                            new String[] { uri.getLastPathSegment() });
-                    break;
-
-                default:
-                    throw new IllegalArgumentException("Unknown URI " + uri);
-            }
-
-
-            if (TextUtils.isEmpty(sortOrder)) {
-                sortOrder = MainTable.DEFAULT_SORT_ORDER;
-            }
-
-            SQLiteDatabase db = mOpenHelper.getReadableDatabase();
-
-            Cursor c = qb.query(db, projection, selection, selectionArgs,
-                    null /* no group */, null /* no filter */, sortOrder);
-
-            c.setNotificationUri(getContext().getContentResolver(), uri);
-            return c;
-        }
-
-        /**
-         * Return the MIME type for an known URI in the provider.
-         */
-        @Override
-        public String getType(Uri uri) {
-            switch (mUriMatcher.match(uri)) {
-                case MAIN:
-                    return MainTable.CONTENT_TYPE;
-                case MAIN_ID:
-                    return MainTable.CONTENT_ITEM_TYPE;
-                default:
-                    throw new IllegalArgumentException("Unknown URI " + uri);
-            }
-        }
-
-        /**
-         * Handler inserting new data.
-         */
-        @Override
-        public Uri insert(Uri uri, ContentValues initialValues) {
-            if (mUriMatcher.match(uri) != MAIN) {
-                // Can only insert into to main URI.
-                throw new IllegalArgumentException("Unknown URI " + uri);
-            }
-
-            ContentValues values;
-
-            if (initialValues != null) {
-                values = new ContentValues(initialValues);
-            } else {
-                values = new ContentValues();
-            }
-
-            if (values.containsKey(MainTable.COLUMN_NAME_DATA) == false) {
-                values.put(MainTable.COLUMN_NAME_DATA, "");
-            }
-
-            SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-
-            long rowId = db.insert(MainTable.TABLE_NAME, null, values);
-
-            // If the insert succeeded, the row ID exists.
-            if (rowId > 0) {
-                Uri noteUri = ContentUris.withAppendedId(MainTable.CONTENT_ID_URI_BASE, rowId);
-                getContext().getContentResolver().notifyChange(noteUri, null);
-                return noteUri;
-            }
-
-            throw new SQLException("Failed to insert row into " + uri);
-        }
-
-        /**
-         * Handle deleting data.
-         */
-        @Override
-        public int delete(Uri uri, String where, String[] whereArgs) {
-            SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-            String finalWhere;
-
-            int count;
-
-            switch (mUriMatcher.match(uri)) {
-                case MAIN:
-                    // If URI is main table, delete uses incoming where clause and args.
-                    count = db.delete(MainTable.TABLE_NAME, where, whereArgs);
-                    break;
-
-                    // If the incoming URI matches a single note ID, does the delete based on the
-                    // incoming data, but modifies the where clause to restrict it to the
-                    // particular note ID.
-                case MAIN_ID:
-                    // If URI is for a particular row ID, delete is based on incoming
-                    // data but modified to restrict to the given ID.
-                    finalWhere = DatabaseUtilsCompat.concatenateWhere(
-                            MainTable._ID + " = " + ContentUris.parseId(uri), where);
-                    count = db.delete(MainTable.TABLE_NAME, finalWhere, whereArgs);
-                    break;
-
-                default:
-                    throw new IllegalArgumentException("Unknown URI " + uri);
-            }
-
-            getContext().getContentResolver().notifyChange(uri, null);
-
-            return count;
-        }
-
-        /**
-         * Handle updating data.
-         */
-        @Override
-        public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
-            SQLiteDatabase db = mOpenHelper.getWritableDatabase();
-            int count;
-            String finalWhere;
-
-            switch (mUriMatcher.match(uri)) {
-                case MAIN:
-                    // If URI is main table, update uses incoming where clause and args.
-                    count = db.update(MainTable.TABLE_NAME, values, where, whereArgs);
-                    break;
-
-                case MAIN_ID:
-                    // If URI is for a particular row ID, update is based on incoming
-                    // data but modified to restrict to the given ID.
-                    finalWhere = DatabaseUtilsCompat.concatenateWhere(
-                            MainTable._ID + " = " + ContentUris.parseId(uri), where);
-                    count = db.update(MainTable.TABLE_NAME, values, finalWhere, whereArgs);
-                    break;
-
-                default:
-                    throw new IllegalArgumentException("Unknown URI " + uri);
-            }
-
-            getContext().getContentResolver().notifyChange(uri, null);
-
-            return count;
-        }
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        FragmentManager fm = getSupportFragmentManager();
-
-        // Create the list fragment and add it as our sole content.
-        if (fm.findFragmentById(android.R.id.content) == null) {
-            ThrottledLoaderListFragment list = new ThrottledLoaderListFragment();
-            fm.beginTransaction().add(android.R.id.content, list).commit();
-        }
-    }
-
-    public static class ThrottledLoaderListFragment extends SherlockListFragment
-            implements LoaderManager.LoaderCallbacks<Cursor> {
-
-        // Menu identifiers
-        static final int POPULATE_ID = Menu.FIRST;
-        static final int CLEAR_ID = Menu.FIRST+1;
-
-        // This is the Adapter being used to display the list's data.
-        SimpleCursorAdapter mAdapter;
-
-        // If non-null, this is the current filter the user has provided.
-        String mCurFilter;
-
-        // Task we have running to populate the database.
-        AsyncTask<Void, Void, Void> mPopulatingTask;
-
-        @Override public void onActivityCreated(Bundle savedInstanceState) {
-            super.onActivityCreated(savedInstanceState);
-
-            setEmptyText("No data.  Select 'Populate' to fill with data from Z to A at a rate of 4 per second.");
-            setHasOptionsMenu(true);
-
-            // Create an empty adapter we will use to display the loaded data.
-            mAdapter = new SimpleCursorAdapter(getActivity(),
-                    android.R.layout.simple_list_item_1, null,
-                    new String[] { MainTable.COLUMN_NAME_DATA },
-                    new int[] { android.R.id.text1 }, 0);
-            setListAdapter(mAdapter);
-
-            // Start out with a progress indicator.
-            setListShown(false);
-
-            // Prepare the loader.  Either re-connect with an existing one,
-            // or start a new one.
-            getLoaderManager().initLoader(0, null, this);
-        }
-
-        @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-            MenuItem populateItem = menu.add(Menu.NONE, POPULATE_ID, 0, "Populate");
-            populateItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-            MenuItem clearItem = menu.add(Menu.NONE, CLEAR_ID, 0, "Clear");
-            clearItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-        }
-
-        @Override public boolean onOptionsItemSelected(MenuItem item) {
-            final ContentResolver cr = getActivity().getContentResolver();
-
-            switch (item.getItemId()) {
-                case POPULATE_ID:
-                    if (mPopulatingTask != null) {
-                        mPopulatingTask.cancel(false);
-                    }
-                    mPopulatingTask = new AsyncTask<Void, Void, Void>() {
-                        @Override protected Void doInBackground(Void... params) {
-                            for (char c='Z'; c>='A'; c--) {
-                                if (isCancelled()) {
-                                    break;
-                                }
-                                StringBuilder builder = new StringBuilder("Data ");
-                                builder.append(c);
-                                ContentValues values = new ContentValues();
-                                values.put(MainTable.COLUMN_NAME_DATA, builder.toString());
-                                cr.insert(MainTable.CONTENT_URI, values);
-                                // Wait a bit between each insert.
-                                try {
-                                    Thread.sleep(250);
-                                } catch (InterruptedException e) {
-                                }
-                            }
-                            return null;
-                        }
-                    };
-                    mPopulatingTask.execute((Void[]) null);
-                    return true;
-
-                case CLEAR_ID:
-                    if (mPopulatingTask != null) {
-                        mPopulatingTask.cancel(false);
-                        mPopulatingTask = null;
-                    }
-                    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
-                        @Override protected Void doInBackground(Void... params) {
-                            cr.delete(MainTable.CONTENT_URI, null, null);
-                            return null;
-                        }
-                    };
-                    task.execute((Void[])null);
-                    return true;
-
-                default:
-                    return super.onOptionsItemSelected(item);
-            }
-        }
-
-        @Override public void onListItemClick(ListView l, View v, int position, long id) {
-            // Insert desired behavior here.
-            Log.i(TAG, "Item clicked: " + id);
-        }
-
-        // These are the rows that we will retrieve.
-        static final String[] PROJECTION = new String[] {
-            MainTable._ID,
-            MainTable.COLUMN_NAME_DATA,
-        };
-
-        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-            CursorLoader cl = new CursorLoader(getActivity(), MainTable.CONTENT_URI,
-                    PROJECTION, null, null, null);
-            cl.setUpdateThrottle(2000); // update at most every 2 seconds.
-            return cl;
-        }
-
-        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-            mAdapter.swapCursor(data);
-
-            // The list should now be shown.
-            if (isResumed()) {
-                setListShown(true);
-            } else {
-                setListShownNoAnimation(true);
-            }
-        }
-
-        public void onLoaderReset(Loader<Cursor> loader) {
-            mAdapter.swapCursor(null);
-        }
-    }
-}
-
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/SampleList.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/SampleList.java
deleted file mode 100644
index 5ec19f1..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/SampleList.java
+++ /dev/null
@@ -1,175 +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.actionbarsherlock.sample.fragments;
-
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.SimpleAdapter;
-import android.widget.Toast;
-
-import com.actionbarsherlock.app.SherlockListActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.actionbarsherlock.view.SubMenu;
-
-public class SampleList extends SherlockListActivity {
-    public static int THEME = R.style.Theme_Sherlock;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        Intent intent = getIntent();
-        String path = intent.getStringExtra("com.example.android.apis.Path");
-
-        if (path == null) {
-            path = "";
-        }
-
-        setListAdapter(new SimpleAdapter(this, getData(path),
-                android.R.layout.simple_list_item_1, new String[] { "title" },
-                new int[] { android.R.id.text1 }));
-        getListView().setTextFilterEnabled(true);
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        SubMenu sub = menu.addSubMenu("Theme");
-        sub.add(0, R.style.Theme_Sherlock, 0, "Default");
-        sub.add(0, R.style.Theme_Sherlock_Light, 0, "Light");
-        sub.add(0, R.style.Theme_Sherlock_Light_DarkActionBar, 0, "Light (Dark Action Bar)");
-        sub.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        if (item.getItemId() == android.R.id.home || item.getItemId() == 0) {
-            return false;
-        }
-        THEME = item.getItemId();
-        Toast.makeText(this, "Theme changed to \"" + item.getTitle() + "\"", Toast.LENGTH_SHORT).show();
-        return true;
-    }
-
-    protected List<Map<String, Object>> getData(String prefix) {
-        List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>();
-
-        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
-        mainIntent.addCategory("com.actionbarsherlock.sample.fragments.EXAMPLE");
-
-        PackageManager pm = getPackageManager();
-        List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
-
-        if (null == list)
-            return myData;
-
-        String[] prefixPath;
-        String prefixWithSlash = prefix;
-
-        if (prefix.equals("")) {
-            prefixPath = null;
-        } else {
-            prefixPath = prefix.split("/");
-            prefixWithSlash = prefix + "/";
-        }
-
-        int len = list.size();
-
-        Map<String, Boolean> entries = new HashMap<String, Boolean>();
-
-        for (int i = 0; i < len; i++) {
-            ResolveInfo info = list.get(i);
-            CharSequence labelSeq = info.loadLabel(pm);
-            String label = labelSeq != null
-                    ? labelSeq.toString()
-                    : info.activityInfo.name;
-
-            if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) {
-
-                String[] labelPath = label.split("/");
-
-                String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length];
-
-                if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) {
-                    addItem(myData, nextLabel, activityIntent(
-                            info.activityInfo.applicationInfo.packageName,
-                            info.activityInfo.name));
-                } else {
-                    if (entries.get(nextLabel) == null) {
-                        addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel));
-                        entries.put(nextLabel, true);
-                    }
-                }
-            }
-        }
-
-        Collections.sort(myData, sDisplayNameComparator);
-
-        return myData;
-    }
-
-    private final static Comparator<Map<String, Object>> sDisplayNameComparator =
-        new Comparator<Map<String, Object>>() {
-        private final Collator   collator = Collator.getInstance();
-
-        public int compare(Map<String, Object> map1, Map<String, Object> map2) {
-            return collator.compare(map1.get("title"), map2.get("title"));
-        }
-    };
-
-    protected Intent activityIntent(String pkg, String componentName) {
-        Intent result = new Intent();
-        result.setClassName(pkg, componentName);
-        return result;
-    }
-
-    protected Intent browseIntent(String path) {
-        Intent result = new Intent();
-        result.setClass(this, SampleList.class);
-        result.putExtra("com.example.android.apis.Path", path);
-        return result;
-    }
-
-    protected void addItem(List<Map<String, Object>> data, String name, Intent intent) {
-        Map<String, Object> temp = new HashMap<String, Object>();
-        temp.put("title", name);
-        temp.put("intent", intent);
-        data.add(temp);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);
-
-        Intent intent = (Intent) map.get("intent");
-        startActivity(intent);
-    }
-}
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/SendResult.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/SendResult.java
deleted file mode 100644
index fa1c28a..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/SendResult.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.actionbarsherlock.sample.fragments;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import com.actionbarsherlock.app.SherlockActivity;
-
-
-/**
- * Example of receiving a result from another activity.
- */
-public class SendResult extends SherlockActivity
-{
-    /**
-     * Initialization of the Activity after it is first created.  Must at least
-     * call {@link android.app.Activity#setContentView setContentView()} to
-     * describe what is to be displayed in the screen.
-     */
-    @Override
-    protected void onCreate(Bundle savedInstanceState)
-    {
-        setTheme(SampleList.THEME); //Used for theme switching in samples
-        // Be sure to call the super class.
-        super.onCreate(savedInstanceState);
-
-        // See assets/res/any/layout/hello_world.xml for this
-        // view layout definition, which is being set here as
-        // the content of our screen.
-        setContentView(R.layout.send_result);
-
-        // Watch for button clicks.
-        Button button = (Button)findViewById(R.id.corky);
-        button.setOnClickListener(mCorkyListener);
-        button = (Button)findViewById(R.id.violet);
-        button.setOnClickListener(mVioletListener);
-    }
-
-    private OnClickListener mCorkyListener = new OnClickListener()
-    {
-        public void onClick(View v)
-        {
-            // To send a result, simply call setResult() before your
-            // activity is finished.
-            setResult(RESULT_OK, (new Intent()).setAction("Corky!"));
-            finish();
-        }
-    };
-
-    private OnClickListener mVioletListener = new OnClickListener()
-    {
-        public void onClick(View v)
-        {
-            // To send a result, simply call setResult() before your
-            // activity is finished.
-            setResult(RESULT_OK, (new Intent()).setAction("Violet!"));
-            finish();
-        }
-    };
-}
-
diff --git a/samples/fragments/src/com/actionbarsherlock/sample/fragments/Shakespeare.java b/samples/fragments/src/com/actionbarsherlock/sample/fragments/Shakespeare.java
deleted file mode 100644
index 66e243f..0000000
--- a/samples/fragments/src/com/actionbarsherlock/sample/fragments/Shakespeare.java
+++ /dev/null
@@ -1,223 +0,0 @@
-package com.actionbarsherlock.sample.fragments;
-
-public final class Shakespeare {
-    /**
-     * Our data, part 1.
-     */
-    public static final String[] TITLES =
-    {
-            "Henry IV (1)",
-            "Henry V",
-            "Henry VIII",
-            "Richard II",
-            "Richard III",
-            "Merchant of Venice",
-            "Othello",
-            "King Lear"
-    };
-
-    /**
-     * Our data, part 2.
-     */
-    public static final String[] DIALOGUE =
-    {
-            "So shaken as we are, so wan with care," +
-            "Find we a time for frighted peace to pant," +
-            "And breathe short-winded accents of new broils" +
-            "To be commenced in strands afar remote." +
-            "No more the thirsty entrance of this soil" +
-            "Shall daub her lips with her own children's blood;" +
-            "Nor more shall trenching war channel her fields," +
-            "Nor bruise her flowerets with the armed hoofs" +
-            "Of hostile paces: those opposed eyes," +
-            "Which, like the meteors of a troubled heaven," +
-            "All of one nature, of one substance bred," +
-            "Did lately meet in the intestine shock" +
-            "And furious close of civil butchery" +
-            "Shall now, in mutual well-beseeming ranks," +
-            "March all one way and be no more opposed" +
-            "Against acquaintance, kindred and allies:" +
-            "The edge of war, like an ill-sheathed knife," +
-            "No more shall cut his master. Therefore, friends," +
-            "As far as to the sepulchre of Christ," +
-            "Whose soldier now, under whose blessed cross" +
-            "We are impressed and engaged to fight," +
-            "Forthwith a power of English shall we levy;" +
-            "Whose arms were moulded in their mothers' womb" +
-            "To chase these pagans in those holy fields" +
-            "Over whose acres walk'd those blessed feet" +
-            "Which fourteen hundred years ago were nail'd" +
-            "For our advantage on the bitter cross." +
-            "But this our purpose now is twelve month old," +
-            "And bootless 'tis to tell you we will go:" +
-            "Therefore we meet not now. Then let me hear" +
-            "Of you, my gentle cousin Westmoreland," +
-            "What yesternight our council did decree" +
-            "In forwarding this dear expedience.",
-
-            "Hear him but reason in divinity," +
-            "And all-admiring with an inward wish" +
-            "You would desire the king were made a prelate:" +
-            "Hear him debate of commonwealth affairs," +
-            "You would say it hath been all in all his study:" +
-            "List his discourse of war, and you shall hear" +
-            "A fearful battle render'd you in music:" +
-            "Turn him to any cause of policy," +
-            "The Gordian knot of it he will unloose," +
-            "Familiar as his garter: that, when he speaks," +
-            "The air, a charter'd libertine, is still," +
-            "And the mute wonder lurketh in men's ears," +
-            "To steal his sweet and honey'd sentences;" +
-            "So that the art and practic part of life" +
-            "Must be the mistress to this theoric:" +
-            "Which is a wonder how his grace should glean it," +
-            "Since his addiction was to courses vain," +
-            "His companies unletter'd, rude and shallow," +
-            "His hours fill'd up with riots, banquets, sports," +
-            "And never noted in him any study," +
-            "Any retirement, any sequestration" +
-            "From open haunts and popularity.",
-
-            "I come no more to make you laugh: things now," +
-            "That bear a weighty and a serious brow," +
-            "Sad, high, and working, full of state and woe," +
-            "Such noble scenes as draw the eye to flow," +
-            "We now present. Those that can pity, here" +
-            "May, if they think it well, let fall a tear;" +
-            "The subject will deserve it. Such as give" +
-            "Their money out of hope they may believe," +
-            "May here find truth too. Those that come to see" +
-            "Only a show or two, and so agree" +
-            "The play may pass, if they be still and willing," +
-            "I'll undertake may see away their shilling" +
-            "Richly in two short hours. Only they" +
-            "That come to hear a merry bawdy play," +
-            "A noise of targets, or to see a fellow" +
-            "In a long motley coat guarded with yellow," +
-            "Will be deceived; for, gentle hearers, know," +
-            "To rank our chosen truth with such a show" +
-            "As fool and fight is, beside forfeiting" +
-            "Our own brains, and the opinion that we bring," +
-            "To make that only true we now intend," +
-            "Will leave us never an understanding friend." +
-            "Therefore, for goodness' sake, and as you are known" +
-            "The first and happiest hearers of the town," +
-            "Be sad, as we would make ye: think ye see" +
-            "The very persons of our noble story" +
-            "As they were living; think you see them great," +
-            "And follow'd with the general throng and sweat" +
-            "Of thousand friends; then in a moment, see" +
-            "How soon this mightiness meets misery:" +
-            "And, if you can be merry then, I'll say" +
-            "A man may weep upon his wedding-day.",
-
-            "First, heaven be the record to my speech!" +
-            "In the devotion of a subject's love," +
-            "Tendering the precious safety of my prince," +
-            "And free from other misbegotten hate," +
-            "Come I appellant to this princely presence." +
-            "Now, Thomas Mowbray, do I turn to thee," +
-            "And mark my greeting well; for what I speak" +
-            "My body shall make good upon this earth," +
-            "Or my divine soul answer it in heaven." +
-            "Thou art a traitor and a miscreant," +
-            "Too good to be so and too bad to live," +
-            "Since the more fair and crystal is the sky," +
-            "The uglier seem the clouds that in it fly." +
-            "Once more, the more to aggravate the note," +
-            "With a foul traitor's name stuff I thy throat;" +
-            "And wish, so please my sovereign, ere I move," +
-            "What my tongue speaks my right drawn sword may prove.",
-
-            "Now is the winter of our discontent" +
-            "Made glorious summer by this sun of York;" +
-            "And all the clouds that lour'd upon our house" +
-            "In the deep bosom of the ocean buried." +
-            "Now are our brows bound with victorious wreaths;" +
-            "Our bruised arms hung up for monuments;" +
-            "Our stern alarums changed to merry meetings," +
-            "Our dreadful marches to delightful measures." +
-            "Grim-visaged war hath smooth'd his wrinkled front;" +
-            "And now, instead of mounting barded steeds" +
-            "To fright the souls of fearful adversaries," +
-            "He capers nimbly in a lady's chamber" +
-            "To the lascivious pleasing of a lute." +
-            "But I, that am not shaped for sportive tricks," +
-            "Nor made to court an amorous looking-glass;" +
-            "I, that am rudely stamp'd, and want love's majesty" +
-            "To strut before a wanton ambling nymph;" +
-            "I, that am curtail'd of this fair proportion," +
-            "Cheated of feature by dissembling nature," +
-            "Deformed, unfinish'd, sent before my time" +
-            "Into this breathing world, scarce half made up," +
-            "And that so lamely and unfashionable" +
-            "That dogs bark at me as I halt by them;" +
-            "Why, I, in this weak piping time of peace," +
-            "Have no delight to pass away the time," +
-            "Unless to spy my shadow in the sun" +
-            "And descant on mine own deformity:" +
-            "And therefore, since I cannot prove a lover," +
-            "To entertain these fair well-spoken days," +
-            "I am determined to prove a villain" +
-            "And hate the idle pleasures of these days." +
-            "Plots have I laid, inductions dangerous," +
-            "By drunken prophecies, libels and dreams," +
-            "To set my brother Clarence and the king" +
-            "In deadly hate the one against the other:" +
-            "And if King Edward be as true and just" +
-            "As I am subtle, false and treacherous," +
-            "This day should Clarence closely be mew'd up," +
-            "About a prophecy, which says that 'G'" +
-            "Of Edward's heirs the murderer shall be." +
-            "Dive, thoughts, down to my soul: here" +
-            "Clarence comes.",
-
-            "To bait fish withal: if it will feed nothing else," +
-            "it will feed my revenge. He hath disgraced me, and" +
-            "hindered me half a million; laughed at my losses," +
-            "mocked at my gains, scorned my nation, thwarted my" +
-            "bargains, cooled my friends, heated mine" +
-            "enemies; and what's his reason? I am a Jew. Hath" +
-            "not a Jew eyes? hath not a Jew hands, organs," +
-            "dimensions, senses, affections, passions? fed with" +
-            "the same food, hurt with the same weapons, subject" +
-            "to the same diseases, healed by the same means," +
-            "warmed and cooled by the same winter and summer, as" +
-            "a Christian is? If you prick us, do we not bleed?" +
-            "if you tickle us, do we not laugh? if you poison" +
-            "us, do we not die? and if you wrong us, shall we not" +
-            "revenge? If we are like you in the rest, we will" +
-            "resemble you in that. If a Jew wrong a Christian," +
-            "what is his humility? Revenge. If a Christian" +
-            "wrong a Jew, what should his sufferance be by" +
-            "Christian example? Why, revenge. The villany you" +
-            "teach me, I will execute, and it shall go hard but I" +
-            "will better the instruction.",
-
-            "Virtue! a fig! 'tis in ourselves that we are thus" +
-            "or thus. Our bodies are our gardens, to the which" +
-            "our wills are gardeners: so that if we will plant" +
-            "nettles, or sow lettuce, set hyssop and weed up" +
-            "thyme, supply it with one gender of herbs, or" +
-            "distract it with many, either to have it sterile" +
-            "with idleness, or manured with industry, why, the" +
-            "power and corrigible authority of this lies in our" +
-            "wills. If the balance of our lives had not one" +
-            "scale of reason to poise another of sensuality, the" +
-            "blood and baseness of our natures would conduct us" +
-            "to most preposterous conclusions: but we have" +
-            "reason to cool our raging motions, our carnal" +
-            "stings, our unbitted lusts, whereof I take this that" +
-            "you call love to be a sect or scion.",
-
-            "Blow, winds, and crack your cheeks! rage! blow!" +
-            "You cataracts and hurricanoes, spout" +
-            "Till you have drench'd our steeples, drown'd the cocks!" +
-            "You sulphurous and thought-executing fires," +
-            "Vaunt-couriers to oak-cleaving thunderbolts," +
-            "Singe my white head! And thou, all-shaking thunder," +
-            "Smite flat the thick rotundity o' the world!" +
-            "Crack nature's moulds, an germens spill at once," +
-            "That make ingrateful man!"
-    };
-}
diff --git a/samples/known-bugs/AndroidManifest.xml b/samples/known-bugs/AndroidManifest.xml
deleted file mode 100644
index f0bc587..0000000
--- a/samples/known-bugs/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="90" android:versionName="4.1.0" package="com.actionbarsherlock.sample.knownbugs">
-
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15"/>
-
-    <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
-
-    <application android:icon="@drawable/icon" android:label="@string/application_name" android:theme="@style/Theme.Sherlock">
-
-        <activity android:label="@string/activity_name" android:name=".SampleList">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-
-
-        <!-- OPEN BUGS -->
-
-        <activity android:label="Issue #331" android:name=".Issue331">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.knownbugs.OPEN"/>
-            </intent-filter>
-        </activity>
-
-
-        <!-- CLOSED BUGS -->
-
-        <activity android:label="Issue #425" android:name=".Issue435">
-            <!-- Fixed in 4.1.0 -->
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="com.actionbarsherlock.sample.knownbugs.CLOSED"/>
-            </intent-filter>
-        </activity>
-
-    </application>
-</manifest>
diff --git a/samples/known-bugs/README.md b/samples/known-bugs/README.md
deleted file mode 100644
index aa19bef..0000000
--- a/samples/known-bugs/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-ActionBarSherlock Sample: Known Bugs
-====================================
-
-This sample demonstrates the known bugs at the time of release. By having this
-included and revisioned with the library we allow for easier verification of
-regressions and fixes.
-
-If you want to submit a new bug to the library it would be extremely helpful
-if you filed a separate pull request which adds a test case. Doing so will
-ensure we can reproduce your bug properly and ensure that a proper fix gets
-implemented.
\ No newline at end of file
diff --git a/samples/known-bugs/libs/android-support-v4.jar b/samples/known-bugs/libs/android-support-v4.jar
deleted file mode 100644
index 99e063b..0000000
--- a/samples/known-bugs/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/pom.xml b/samples/known-bugs/pom.xml
deleted file mode 100644
index 543f3a6..0000000
--- a/samples/known-bugs/pom.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.actionbarsherlock</groupId>
-	<artifactId>sample-known-bugs</artifactId>
-	<name>Sample: Known Bugs</name>
-	<packaging>apk</packaging>
-
-	<parent>
-		<groupId>com.actionbarsherlock</groupId>
-		<artifactId>parent-sample</artifactId>
-		<version>4.1.0</version>
-		<relativePath>../pom.xml</relativePath>
-	</parent>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.google.android</groupId>
-			<artifactId>android</artifactId>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.actionbarsherlock</groupId>
-			<artifactId>library</artifactId>
-			<version>${project.version}</version>
-			<type>apklib</type>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<sourceDirectory>src</sourceDirectory>
-		<finalName>${apk.prefix}-${project.artifactId}-${project.version}-unaligned</finalName>
-
-		<plugins>
-			<plugin>
-				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
-				<artifactId>android-maven-plugin</artifactId>
-				<extensions>true</extensions>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>zipalign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jarsigner-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>sign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-checkstyle-plugin</artifactId>
-				<configuration>
-					<configLocation>../../checkstyle.xml</configLocation>
-				</configuration>
-				<executions>
-					<execution>
-						<phase>verify</phase>
-						<goals>
-							<goal>checkstyle</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-
-	<profiles>
-		<profile>
-			<id>abs-release</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>com.github.github</groupId>
-						<artifactId>downloads-maven-plugin</artifactId>
-						<executions>
-							<execution>
-								<phase>deploy</phase>
-								<goals>
-									<goal>upload</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-</project>
diff --git a/samples/known-bugs/project.properties b/samples/known-bugs/project.properties
deleted file mode 100644
index d29d6c7..0000000
--- a/samples/known-bugs/project.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-14
-android.library.reference.1=../../library
-
-
-
-
-
diff --git a/samples/known-bugs/res/anim/issue331_refresh.xml b/samples/known-bugs/res/anim/issue331_refresh.xml
deleted file mode 100644
index 30de199..0000000
--- a/samples/known-bugs/res/anim/issue331_refresh.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<rotate xmlns:android="http://schemas.android.com/apk/res/android"
-        android:fromDegrees="0"
-        android:toDegrees="360"
-        android:pivotX="50%"
-        android:pivotY="50%"
-        android:duration="1000"
-        android:interpolator="@android:anim/linear_interpolator"/>
\ No newline at end of file
diff --git a/samples/known-bugs/res/drawable-hdpi/ic_refresh.png b/samples/known-bugs/res/drawable-hdpi/ic_refresh.png
deleted file mode 100644
index 08c32e0..0000000
--- a/samples/known-bugs/res/drawable-hdpi/ic_refresh.png
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/res/drawable-hdpi/icon.png b/samples/known-bugs/res/drawable-hdpi/icon.png
deleted file mode 100644
index 723fbf0..0000000
--- a/samples/known-bugs/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/res/drawable-ldpi/icon.png b/samples/known-bugs/res/drawable-ldpi/icon.png
deleted file mode 100644
index 181f679..0000000
--- a/samples/known-bugs/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/res/drawable-mdpi/ic_refresh.png b/samples/known-bugs/res/drawable-mdpi/ic_refresh.png
deleted file mode 100644
index 55c43c3..0000000
--- a/samples/known-bugs/res/drawable-mdpi/ic_refresh.png
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/res/drawable-mdpi/icon.png b/samples/known-bugs/res/drawable-mdpi/icon.png
deleted file mode 100644
index 79f50d8..0000000
--- a/samples/known-bugs/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/res/drawable-xhdpi/icon.png b/samples/known-bugs/res/drawable-xhdpi/icon.png
deleted file mode 100644
index 34ca9a4..0000000
--- a/samples/known-bugs/res/drawable-xhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/known-bugs/res/layout/issue331_action_view.xml b/samples/known-bugs/res/layout/issue331_action_view.xml
deleted file mode 100644
index e77ec08..0000000
--- a/samples/known-bugs/res/layout/issue331_action_view.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
-           android:layout_width="wrap_content"
-           android:layout_height="wrap_content"
-           android:src="@drawable/ic_refresh"
-           style="@style/Widget.Sherlock.ActionButton"/>
\ No newline at end of file
diff --git a/samples/known-bugs/res/values/strings.xml b/samples/known-bugs/res/values/strings.xml
deleted file mode 100644
index 4dc4249..0000000
--- a/samples/known-bugs/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-    <string name="application_name">ActionBarSherlock Known Bugs</string>
-    <string name="activity_name">ABS: Bugs</string>
-</resources>
diff --git a/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/Issue331.java b/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/Issue331.java
deleted file mode 100644
index f442ce4..0000000
--- a/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/Issue331.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.actionbarsherlock.sample.knownbugs;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.widget.Button;
-import android.widget.ImageView;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-import static android.view.View.OnClickListener;
-
-public class Issue331 extends SherlockActivity {
-    boolean mShow = true;
-
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Button b = new Button(this);
-        b.setText("Click action item and then this button twice on pre-ICS");
-        b.setOnClickListener(new OnClickListener() {
-            public void onClick(View v) {
-                mShow = !mShow;
-                invalidateOptionsMenu();
-            }
-        });
-        setContentView(b);
-    }
-
-    public boolean onCreateOptionsMenu(Menu menu) {
-        if (mShow) {
-            menu.add("Refresh").setIcon(R.drawable.ic_refresh).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
-        }
-        return true;
-    }
-
-    public boolean onMenuItemSelected(int featureId, MenuItem item) {
-        ImageView iv = (ImageView) LayoutInflater.from(this).inflate(R.layout.issue331_action_view, null);
-        Animation r = AnimationUtils.loadAnimation(this, R.anim.issue331_refresh);
-        r.setRepeatCount(Animation.INFINITE);
-        iv.startAnimation(r);
-        item.setActionView(iv);
-        return true;
-    }
-}
diff --git a/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/Issue435.java b/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/Issue435.java
deleted file mode 100644
index 6b26565..0000000
--- a/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/Issue435.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.actionbarsherlock.sample.knownbugs;
-
-import android.graphics.drawable.GradientDrawable;
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockActivity;
-import com.actionbarsherlock.view.ActionMode;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-
-import static android.graphics.drawable.GradientDrawable.Orientation.TOP_BOTTOM;
-
-public class Issue435 extends SherlockActivity implements View.OnClickListener, ActionBar.TabListener {
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        LinearLayout layout = new LinearLayout(this);
-        layout.setOrientation(LinearLayout.VERTICAL);
-
-        TextView t = new TextView(this);
-        t.setText("Must be on a portrait device where the tabs are stacked. Stacked background will disappear when action mode is triggered.");
-        layout.addView(t);
-
-        Button b = new Button(this);
-        b.setText("Start ActionMode");
-        b.setOnClickListener(this);
-        layout.addView(b);
-
-        setContentView(layout);
-
-        ActionBar ab = getSupportActionBar();
-        ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-        ab.addTab(ab.newTab().setText("One").setTabListener(this));
-        ab.addTab(ab.newTab().setText("One").setTabListener(this));
-        ab.addTab(ab.newTab().setText("One").setTabListener(this));
-
-        ab.setBackgroundDrawable(new GradientDrawable(TOP_BOTTOM, new int[] { 0xFF004400, 0xFF002200 }));
-        ab.setStackedBackgroundDrawable(new GradientDrawable(TOP_BOTTOM, new int[] { 0xFF440000, 0xFF220000 }));
-    }
-
-    @Override public void onClick(View v) {
-        ActionMode am = startActionMode(new SuperSweetActionModeOfScience());
-        am.setTitle("Hello, Broken?");
-    }
-
-    @Override
-    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
-        /* Empty */
-    }
-
-    @Override
-    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
-        /* Empty */
-    }
-
-    @Override
-    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
-        /* Empty */
-    }
-
-    private static final class SuperSweetActionModeOfScience implements ActionMode.Callback {
-        @Override
-        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-            return true;
-        }
-
-        @Override
-        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            return false;
-        }
-
-        @Override
-        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            return false;
-        }
-
-        @Override
-        public void onDestroyActionMode(ActionMode mode) {
-            /* Empty */
-        }
-    }
-}
diff --git a/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/SampleList.java b/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/SampleList.java
deleted file mode 100644
index 4289a02..0000000
--- a/samples/known-bugs/src/com/actionbarsherlock/sample/knownbugs/SampleList.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2012 Jake Wharton
- *
- * 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.actionbarsherlock.sample.knownbugs;
-
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.support.v4.app.FragmentTransaction;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockListActivity;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static android.content.Intent.ACTION_MAIN;
-import static com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_TABS;
-import static java.util.Locale.ENGLISH;
-
-public class SampleList extends SherlockListActivity implements ActionBar.TabListener {
-    private final IntentAdapter mAdapter = new IntentAdapter();
-    private String mCategory = "OPEN";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        final ActionBar actionBar = getSupportActionBar();
-        actionBar.setNavigationMode(NAVIGATION_MODE_TABS);
-        actionBar.addTab(actionBar.newTab().setText("Open").setTabListener(this));
-        actionBar.addTab(actionBar.newTab().setText("Closed").setTabListener(this));
-
-        setListAdapter(mAdapter);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        startActivity(mAdapter.getItem(position));
-    }
-
-    @Override
-    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
-        mCategory = tab.getText().toString().toUpperCase(ENGLISH);
-        mAdapter.refresh();
-    }
-
-    @Override
-    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
-        /* Empty */
-    }
-
-    @Override
-    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
-        /* Empty */
-    }
-
-  private class IntentAdapter extends BaseAdapter {
-        private final List<CharSequence> mNames;
-        private final Map<CharSequence, Intent> mIntents;
-
-        IntentAdapter() {
-            mNames = new ArrayList<CharSequence>();
-            mIntents = new HashMap<CharSequence, Intent>();
-        }
-
-        void refresh() {
-            mNames.clear();
-            mIntents.clear();
-
-            final Intent mainIntent = new Intent(ACTION_MAIN, null);
-            mainIntent.addCategory("com.actionbarsherlock.sample.knownbugs." + mCategory);
-
-            PackageManager pm = getPackageManager();
-            final List<ResolveInfo> matches = pm.queryIntentActivities(mainIntent, 0);
-            for (ResolveInfo match : matches) {
-                Intent intent = new Intent();
-                intent.setClassName(match.activityInfo.packageName, match.activityInfo.name);
-                final CharSequence name = match.loadLabel(pm);
-                mNames.add(name);
-                mIntents.put(name, intent);
-            }
-
-            notifyDataSetChanged();
-        }
-
-      @Override
-      public int getCount() {
-          return mNames.size();
-      }
-
-      @Override
-      public Intent getItem(int position) {
-          return mIntents.get(mNames.get(position));
-      }
-
-      @Override
-      public long getItemId(int position) {
-          return position;
-      }
-
-      @Override
-      public View getView(int position, View convertView, ViewGroup parent) {
-          TextView tv = (TextView)convertView;
-          if (convertView == null) {
-              tv = (TextView) LayoutInflater.from(SampleList.this).inflate(android.R.layout.simple_list_item_1, parent, false);
-          }
-          tv.setText(mNames.get(position));
-          return tv;
-      }
-    }
-}
diff --git a/samples/pom.xml b/samples/pom.xml
deleted file mode 100644
index 4ceae5c..0000000
--- a/samples/pom.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.actionbarsherlock</groupId>
-	<artifactId>parent-sample</artifactId>
-	<name>Sample (Parent)</name>
-	<packaging>pom</packaging>
-
-	<parent>
-		<groupId>com.actionbarsherlock</groupId>
-		<artifactId>parent</artifactId>
-		<version>4.1.0</version>
-		<relativePath>../pom.xml</relativePath>
-	</parent>
-
-	<modules>
-		<module>demos</module>
-		<module>fragments</module>
-		<module>known-bugs</module>
-		<module>roboguice</module>
-		<module>styled</module>
-	</modules>
-</project>
diff --git a/samples/roboguice/AndroidManifest.xml b/samples/roboguice/AndroidManifest.xml
deleted file mode 100644
index b671f20..0000000
--- a/samples/roboguice/AndroidManifest.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="90" android:versionName="4.1.0" package="com.actionbarsherlock.sample.roboguice">
-
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15"/>
-
-    <uses-permission android:name="android.permission.VIBRATE"/>
-
-    <application android:icon="@drawable/icon" android:label="ActionBarSherlock RoboGuice" android:theme="@style/Theme.Sherlock">
-
-        <activity android:label="ABS: RoboGuice" android:name=".activity.AstroboyMasterConsole">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:name=".activity.FightForcesOfEvilActivity"/>
-
-    </application>
-</manifest>
diff --git a/samples/roboguice/README.md b/samples/roboguice/README.md
deleted file mode 100644
index ec09b5f..0000000
--- a/samples/roboguice/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-ActionBarSherlock Sample: RoboGuice
-===================================
-
-See [actionbarsherlock.com/samples.html][1] for information on the sample
-contained in this folder.
-
-This sample uses the [roboguice-sherlock][2] plugin from Roberto Tyley.
-
-
-
-
-
-
-
- [1]: http://actionbarsherlock.com/samples.html
- [2]: https://github.com/rtyley/roboguice-sherlock
diff --git a/samples/roboguice/libs/android-support-v4.jar b/samples/roboguice/libs/android-support-v4.jar
deleted file mode 100644
index 99e063b..0000000
--- a/samples/roboguice/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/libs/guice-3.0-no_aop.jar b/samples/roboguice/libs/guice-3.0-no_aop.jar
deleted file mode 100644
index ef3a55b..0000000
--- a/samples/roboguice/libs/guice-3.0-no_aop.jar
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/libs/javax.inject-1.jar b/samples/roboguice/libs/javax.inject-1.jar
deleted file mode 100644
index b2a9d0b..0000000
--- a/samples/roboguice/libs/javax.inject-1.jar
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/libs/roboguice-2.0b4.jar b/samples/roboguice/libs/roboguice-2.0b4.jar
deleted file mode 100644
index 4704414..0000000
--- a/samples/roboguice/libs/roboguice-2.0b4.jar
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/libs/roboguice-sherlock-1.0.jar b/samples/roboguice/libs/roboguice-sherlock-1.0.jar
deleted file mode 100644
index 604b007..0000000
--- a/samples/roboguice/libs/roboguice-sherlock-1.0.jar
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/pom.xml b/samples/roboguice/pom.xml
deleted file mode 100644
index 385847b..0000000
--- a/samples/roboguice/pom.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.actionbarsherlock</groupId>
-	<artifactId>sample-roboguice</artifactId>
-	<name>Sample: RoboGuice</name>
-	<packaging>apk</packaging>
-
-	<parent>
-		<groupId>com.actionbarsherlock</groupId>
-		<artifactId>parent-sample</artifactId>
-		<version>4.1.0</version>
-		<relativePath>../pom.xml</relativePath>
-	</parent>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.google.android</groupId>
-			<artifactId>android</artifactId>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.actionbarsherlock</groupId>
-			<artifactId>library</artifactId>
-			<version>${project.version}</version>
-			<type>apklib</type>
-		</dependency>
-
-		<!-- https://github.com/rtyley/roboguice-sherlock -->
-		<dependency>
-			<groupId>com.github.rtyley</groupId>
-			<artifactId>roboguice-sherlock</artifactId>
-			<version>1.4</version>
-		</dependency>
-	</dependencies>
-
-	<repositories>
-		<repository>
-			<id>oss-sonatype</id>
-			<name>oss-sonatype</name>
-			<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-			<snapshots>
-				<enabled>true</enabled>
-			</snapshots>
-		</repository>
-	</repositories>
-
-	<build>
-		<sourceDirectory>src</sourceDirectory>
-		<finalName>${apk.prefix}-${project.artifactId}-${project.version}-unaligned</finalName>
-
-		<plugins>
-			<plugin>
-				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
-				<artifactId>android-maven-plugin</artifactId>
-				<extensions>true</extensions>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>zipalign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jarsigner-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>sign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-checkstyle-plugin</artifactId>
-				<configuration>
-					<configLocation>../../checkstyle.xml</configLocation>
-				</configuration>
-				<executions>
-					<execution>
-						<phase>verify</phase>
-						<goals>
-							<goal>checkstyle</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-
-	<profiles>
-		<profile>
-			<id>abs-release</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>com.github.github</groupId>
-						<artifactId>downloads-maven-plugin</artifactId>
-						<executions>
-							<execution>
-								<phase>deploy</phase>
-								<goals>
-									<goal>upload</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-</project>
diff --git a/samples/roboguice/project.properties b/samples/roboguice/project.properties
deleted file mode 100644
index 602c3af..0000000
--- a/samples/roboguice/project.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-14
-android.library.reference.1=../../library
-
-
-
diff --git a/samples/roboguice/res/anim/expletive_animation.xml b/samples/roboguice/res/anim/expletive_animation.xml
deleted file mode 100644
index 9d11d8d..0000000
--- a/samples/roboguice/res/anim/expletive_animation.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<rotate
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:fromDegrees="0"
-    android:toDegrees="360"
-    android:pivotX="50%"
-    android:pivotY="50%"
-    android:repeatCount="infinite"
-    android:duration="500" />
diff --git a/samples/roboguice/res/drawable-hdpi/icon.png b/samples/roboguice/res/drawable-hdpi/icon.png
deleted file mode 100644
index 723fbf0..0000000
--- a/samples/roboguice/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/res/drawable-ldpi/icon.png b/samples/roboguice/res/drawable-ldpi/icon.png
deleted file mode 100644
index 181f679..0000000
--- a/samples/roboguice/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/res/drawable-mdpi/icon.png b/samples/roboguice/res/drawable-mdpi/icon.png
deleted file mode 100644
index 79f50d8..0000000
--- a/samples/roboguice/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/res/drawable-xhdpi/icon.png b/samples/roboguice/res/drawable-xhdpi/icon.png
deleted file mode 100644
index 34ca9a4..0000000
--- a/samples/roboguice/res/drawable-xhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/roboguice/res/layout/fight_evil.xml b/samples/roboguice/res/layout/fight_evil.xml
deleted file mode 100644
index a44ecce..0000000
--- a/samples/roboguice/res/layout/fight_evil.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-
-    <TextView
-        android:id="@+id/expletive"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:gravity="center"
-        />
-
-</LinearLayout>
diff --git a/samples/roboguice/res/layout/main.xml b/samples/roboguice/res/layout/main.xml
deleted file mode 100644
index c608c7a..0000000
--- a/samples/roboguice/res/layout/main.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-    
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="Welcome back, Doctor Tenma."
-        android:layout_marginBottom="20dp"
-        />
-
-    <TextView
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="Send a remote command to Astroboy:"
-        />
-
-    <EditText
-        android:id="@+id/say_text"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:hint="Say Something"
-        />
-
-    <Button
-        android:id="@+id/brush_teeth"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="Brush Teeth"
-        />
-
-    <Button
-        android:id="@+id/fight_evil"
-        android:tag="fightevil"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:text="Fight Forces of Evil"
-        />
-
-
-    <Button
-        android:id="@+id/self_destruct"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:text="Self Destruct"/>
-    
-</LinearLayout>
diff --git a/samples/roboguice/res/values/strings.xml b/samples/roboguice/res/values/strings.xml
deleted file mode 100644
index 5025c0f..0000000
--- a/samples/roboguice/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">Astroboy</string>
-</resources>
diff --git a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/activity/AstroboyMasterConsole.java b/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/activity/AstroboyMasterConsole.java
deleted file mode 100644
index 6625e5e..0000000
--- a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/activity/AstroboyMasterConsole.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.actionbarsherlock.sample.roboguice.activity;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Vibrator;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-import com.actionbarsherlock.sample.roboguice.R;
-import com.actionbarsherlock.sample.roboguice.controller.AstroboyRemoteControl;
-import com.github.rtyley.android.sherlock.roboguice.activity.RoboSherlockActivity;
-import com.google.inject.Inject;
-import roboguice.inject.ContentView;
-import roboguice.inject.InjectView;
-
-
-/**
- * This activity uses an AstroboyRemoteControl to control Astroboy remotely!
- *
- * What you'll learn in this class:
- *   - How to use @InjectView as a typesafe version of findViewById()
- *   - How to inject plain old java objects as well (POJOs)
- *   - When injection happens
- *   - Some basics about injection, including when injection results in a call to
- *     an object's default constructor, versus when it does something "special"
- *     like call getSystemService()
- */
-@ContentView(R.layout.main)
-public class AstroboyMasterConsole extends RoboSherlockActivity {
-
-    // Various views that we inject into the activity.
-    // Equivalent to calling findViewById() in your onCreate(), except more succinct
-    @InjectView(R.id.self_destruct) Button selfDestructButton;
-    @InjectView(R.id.say_text)      EditText sayText;
-    @InjectView(R.id.brush_teeth)   Button brushTeethButton;
-    @InjectView(tag="fightevil")    Button fightEvilButton;     // we can also use tags if we want
-
-
-    // Standard Guice injection of Plain Old Java Objects (POJOs)
-    // Guice will find or create the appropriate instance of AstroboyRemoteControl for us
-    // Since we haven't specified a special binding for AstroboyRemoteControl, Guice
-    // will create a new instance for us using AstroboyRemoteControl's default constructor.
-    // Contrast this with Vibrator, which is an Android service that is pre-bound by RoboGuice.
-    // Injecting a Vibrator will return a new instance of a Vibrator obtained by calling
-    // context.getSystemService(VIBRATOR_SERVICE).  This is configured in DefaultRoboModule, which is
-    // used by default to configure every RoboGuice injector.
-    @Inject AstroboyRemoteControl remoteControl;
-    @Inject Vibrator vibrator;
-
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState); // @Inject, @InjectResource, and @InjectExtra injection happens during super.onCreate()
-
-        sayText.setOnEditorActionListener(new OnEditorActionListener() {
-            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
-
-                // Have the remoteControl tell Astroboy to say something
-                remoteControl.say(textView.getText().toString());
-                textView.setText(null);
-                return true;
-            }
-        });
-
-        brushTeethButton.setOnClickListener( new OnClickListener() {
-            public void onClick(View view) {
-                remoteControl.brushTeeth();
-            }
-        });
-
-        selfDestructButton.setOnClickListener( new OnClickListener() {
-            public void onClick(View view) {
-
-                // Self destruct the remoteControl
-                vibrator.vibrate(2000);
-                remoteControl.selfDestruct();
-            }
-        });
-
-        // Fighting the forces of evil deserves its own activity
-        fightEvilButton.setOnClickListener( new OnClickListener() {
-            public void onClick(View view) {
-                startActivity(new Intent(AstroboyMasterConsole.this, FightForcesOfEvilActivity.class));
-            }
-        });
-
-    }
-
-}
-
-
-
-
diff --git a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/activity/FightForcesOfEvilActivity.java b/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/activity/FightForcesOfEvilActivity.java
deleted file mode 100644
index f28748a..0000000
--- a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/activity/FightForcesOfEvilActivity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.actionbarsherlock.sample.roboguice.activity;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.view.animation.Animation;
-import android.widget.TextView;
-import com.actionbarsherlock.sample.roboguice.R;
-import com.actionbarsherlock.sample.roboguice.controller.Astroboy;
-import com.github.rtyley.android.sherlock.roboguice.activity.RoboSherlockActivity;
-import com.google.inject.Inject;
-import roboguice.inject.InjectResource;
-import roboguice.inject.InjectView;
-import roboguice.util.RoboAsyncTask;
-
-import java.util.Random;
-
-/**
- * Things you'll learn in this class:
- *     - How to inject Resources
- *     - How to use RoboAsyncTask to do background tasks with injection
- *     - What it means to be a @Singleton
- */
-public class FightForcesOfEvilActivity extends RoboSherlockActivity {
-
-    @InjectView(R.id.expletive) TextView expletiveText;
-
-    // You can also inject resources such as Strings, Drawables, and Animations
-    @InjectResource(R.anim.expletive_animation) Animation expletiveAnimation;
-
-    // AstroboyRemoteControl is annotated as @ContextSingleton, so the instance
-    // we get in FightForcesOfEvilActivity will be a different instance than
-    // the one we got in AstroboyMasterConsole
-    //@Inject AstroboyRemoteControl remoteControl;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.fight_evil);
-
-        expletiveText.setAnimation(expletiveAnimation);
-        expletiveAnimation.start();
-
-        // Throw some punches
-        for( int i=0; i<10; ++i )
-            new AsyncPunch(this) {
-                @Override
-                protected void onSuccess(String expletive) throws Exception {
-                    expletiveText.setText(expletive);
-                }
-
-                // We could also override onException() and onFinally() if we wanted
-
-            }.execute();
-
-    }
-
-
-
-    // This class will call Astroboy.punch() in the background
-    public static class AsyncPunch extends RoboAsyncTask<String> {
-
-        // Because Astroboy is a @Singleton, this will be the same
-        // instance that we inject elsewhere in our app.
-        // Random of course will be a new instance of java.util.Random, since
-        // we haven't specified any special binding instructions anywhere
-        @Inject Astroboy astroboy;
-        @Inject Random random;
-
-        public AsyncPunch(Context context) {
-            super(context);
-        }
-
-        public String call() throws Exception {
-            Thread.sleep(random.nextInt(5*1000));
-            return astroboy.punch();
-        }
-    }
-}
diff --git a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/controller/Astroboy.java b/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/controller/Astroboy.java
deleted file mode 100644
index be3211e..0000000
--- a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/controller/Astroboy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.actionbarsherlock.sample.roboguice.controller;
-
-import android.app.Application;
-import android.os.Vibrator;
-import android.widget.Toast;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-import java.util.Random;
-
-
-/**
- * What you'll learn in this class:
- *   - What it means to be a @Singleton
- *   - That Singletons must use Provider<Context> instead of Context to get
- *     the current context
- *   - Some basics about injection, including when injection results in a call to
- *     an object's default constructor, versus when it does something "special" like
- *     call getSystemService()
- */
-
-// There's only one Astroboy, so make it a @Singleton.
-// This means that there will be only one instance of Astroboy in the entire app.
-// Any class that requires an instance of Astroboy will get the same instance.
-// This also means this class needs to be thread safe, of course
-@Singleton
-public class Astroboy {
-
-    // Because Astroboy is a Singleton, we can't directly inject the current Context
-    // since the current context may change depending on what activity is using Astroboy
-    // at the time.  Instead we use the application context.
-    // Vibrator is bound to context.getSystemService(VIBRATOR_SERVICE) in DefaultRoboModule.
-    // Random has no special bindings, so Guice will create a new instance for us.
-    @Inject Application application;
-    @Inject Vibrator vibrator;
-    @Inject Random random;
-
-    public void say(String something) {
-        // Make a Toast, using the current context as returned by the Context Provider
-        Toast.makeText(application, "Astroboy says, \"" + something + "\"", Toast.LENGTH_LONG).show();
-    }
-
-    public void brushTeeth() {
-        vibrator.vibrate(new long[]{0, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50, 200, 50,  }, -1);
-    }
-
-    public String punch() {
-        final String expletives[] = new String[]{"POW!", "BANG!", "KERPOW!", "OOF!"};
-        return expletives[random.nextInt(expletives.length)];
-    }
-}
diff --git a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/controller/AstroboyRemoteControl.java b/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/controller/AstroboyRemoteControl.java
deleted file mode 100644
index fc9b67c..0000000
--- a/samples/roboguice/src/com/actionbarsherlock/sample/roboguice/controller/AstroboyRemoteControl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.actionbarsherlock.sample.roboguice.controller;
-
-import roboguice.inject.ContextSingleton;
-import roboguice.util.Ln;
-
-import android.app.Activity;
-import android.widget.Toast;
-
-import com.google.inject.Inject;
-
-/**
- * A class to control Astroboy remotely.
- *
- * This class uses the current context, so we must make it @ContextSingleton.
- * This means that there will be one AstroboyRemoteControl for every activity or
- * service that requires one.
- * Note that we actually ask for the Activity, rather than the Context (which is
- * the same thing), because we need access to some activity-related methods and this
- * saves us from having to downcast to an Activity manually.
- *
- * It also asks RoboGuice to inject the Astroboy instance so we can control him.
- *
- * What you'll learn in this class
- *   - What @ContextScope means and when to use it
- *   - How to inject an Activity instead of a Context (which is really the same thing)
- *   - How to use RoboGuice's convenient and flexible logging facility, Ln.
- */
-@ContextSingleton
-public class AstroboyRemoteControl {
-
-
-    // The Astroboy class has been decorated with @Singleton, so this instance of
-    // Astroboy will be the same instance used elsewhere in our app.
-    // Injecting an Activity is basically equivalent to "@Inject Context context",
-    // and thus also requires @ContextScope. If you wanted, you could also
-    // @Inject Application, Service, etc. wherever appropriate.
-    @Inject Astroboy astroboy;
-    @Inject Activity activity;
-
-
-
-    public void brushTeeth() {
-        // More info about logging available here: http://code.google.com/p/roboguice/wiki/Logging
-        Ln.d("Sent brushTeeth command to Astroboy");
-        astroboy.brushTeeth();
-    }
-
-    public void say( String something ) {
-        Ln.d("Sent say(%s) command to Astroboy",something);
-        astroboy.say(something);
-    }
-
-    public void selfDestruct() {
-        Toast.makeText(activity, "Your evil remote control has exploded! Now Astroboy is FREEEEEEEEEE!", Toast.LENGTH_LONG).show();
-        activity.finish();
-    }
-}
diff --git a/samples/styled/AndroidManifest.xml b/samples/styled/AndroidManifest.xml
deleted file mode 100644
index 11a56df..0000000
--- a/samples/styled/AndroidManifest.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="80" android:versionName="4.1.0" package="com.actionbarsherlock.sample.styled">
-
-    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15"/>
-
-    <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
-
-    <application android:icon="@drawable/icon" android:label="@string/application_name">
-
-        <activity android:label="@string/activity_name" android:logo="@drawable/ad_logo" android:name=".MainActivity" android:theme="@style/Theme.AndroidDevelopers">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-
-    </application>
-</manifest>
diff --git a/samples/styled/README.md b/samples/styled/README.md
deleted file mode 100644
index 6323b1d..0000000
--- a/samples/styled/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-ActionBarSherlock Sample: Styled
-================================
-
-See [actionbarsherlock.com/samples.html][1] for information on the sample
-contained in this folder.
-
-
-
-
-
-
-
- [1]: http://actionbarsherlock.com/samples.html
diff --git a/samples/styled/libs/android-support-v4.jar b/samples/styled/libs/android-support-v4.jar
deleted file mode 100644
index 99e063b..0000000
--- a/samples/styled/libs/android-support-v4.jar
+++ /dev/null
Binary files differ
diff --git a/samples/styled/libs/nineoldandroids-2.2.0.jar b/samples/styled/libs/nineoldandroids-2.2.0.jar
deleted file mode 100644
index 50a62e1..0000000
--- a/samples/styled/libs/nineoldandroids-2.2.0.jar
+++ /dev/null
Binary files differ
diff --git a/samples/styled/pom.xml b/samples/styled/pom.xml
deleted file mode 100644
index f853945..0000000
--- a/samples/styled/pom.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-
-	<groupId>com.actionbarsherlock</groupId>
-	<artifactId>sample-styled</artifactId>
-	<name>Sample: Styled</name>
-	<packaging>apk</packaging>
-
-	<parent>
-		<groupId>com.actionbarsherlock</groupId>
-		<artifactId>parent-sample</artifactId>
-		<version>4.1.0</version>
-		<relativePath>../pom.xml</relativePath>
-	</parent>
-
-	<dependencies>
-		<dependency>
-			<groupId>com.google.android</groupId>
-			<artifactId>android</artifactId>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>com.actionbarsherlock</groupId>
-			<artifactId>library</artifactId>
-			<version>${project.version}</version>
-			<type>apklib</type>
-		</dependency>
-		<dependency>
-			<groupId>com.nineoldandroids</groupId>
-			<artifactId>library</artifactId>
-			<version>2.2.0</version>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<sourceDirectory>src</sourceDirectory>
-		<finalName>${apk.prefix}-${project.artifactId}-${project.version}-unaligned</finalName>
-
-		<plugins>
-			<plugin>
-				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
-				<artifactId>android-maven-plugin</artifactId>
-				<extensions>true</extensions>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>zipalign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jarsigner-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>package</phase>
-						<goals>
-							<goal>sign</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-checkstyle-plugin</artifactId>
-				<configuration>
-					<configLocation>../../checkstyle.xml</configLocation>
-				</configuration>
-				<executions>
-					<execution>
-						<phase>verify</phase>
-						<goals>
-							<goal>checkstyle</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
-
-	<profiles>
-		<profile>
-			<id>abs-release</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>com.github.github</groupId>
-						<artifactId>downloads-maven-plugin</artifactId>
-						<executions>
-							<execution>
-								<phase>deploy</phase>
-								<goals>
-									<goal>upload</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-</project>
diff --git a/samples/styled/project.properties b/samples/styled/project.properties
deleted file mode 100644
index 9491978..0000000
--- a/samples/styled/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-14
-android.library.reference.1=../../library
-
-
-
-
diff --git a/samples/styled/res/drawable-hdpi/ic_stat_android.png b/samples/styled/res/drawable-hdpi/ic_stat_android.png
deleted file mode 100644
index eb01dd0..0000000
--- a/samples/styled/res/drawable-hdpi/ic_stat_android.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-hdpi/icon.png b/samples/styled/res/drawable-hdpi/icon.png
deleted file mode 100644
index 723fbf0..0000000
--- a/samples/styled/res/drawable-hdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-ldpi/ic_stat_android.png b/samples/styled/res/drawable-ldpi/ic_stat_android.png
deleted file mode 100644
index ecfc1f6..0000000
--- a/samples/styled/res/drawable-ldpi/ic_stat_android.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-ldpi/icon.png b/samples/styled/res/drawable-ldpi/icon.png
deleted file mode 100644
index 181f679..0000000
--- a/samples/styled/res/drawable-ldpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_btn_check_off_pressed_holo_light.png b/samples/styled/res/drawable-mdpi/ad_btn_check_off_pressed_holo_light.png
deleted file mode 100644
index 9ca4c60..0000000
--- a/samples/styled/res/drawable-mdpi/ad_btn_check_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_btn_check_on_pressed_holo_light.png b/samples/styled/res/drawable-mdpi/ad_btn_check_on_pressed_holo_light.png
deleted file mode 100644
index 45f69c3..0000000
--- a/samples/styled/res/drawable-mdpi/ad_btn_check_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_btn_radio_off_pressed_holo_light.png b/samples/styled/res/drawable-mdpi/ad_btn_radio_off_pressed_holo_light.png
deleted file mode 100644
index f4393fc..0000000
--- a/samples/styled/res/drawable-mdpi/ad_btn_radio_off_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_btn_radio_on_pressed_holo_light.png b/samples/styled/res/drawable-mdpi/ad_btn_radio_on_pressed_holo_light.png
deleted file mode 100644
index 2f54feb..0000000
--- a/samples/styled/res/drawable-mdpi/ad_btn_radio_on_pressed_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_logo.png b/samples/styled/res/drawable-mdpi/ad_logo.png
deleted file mode 100644
index 0d8f2c9..0000000
--- a/samples/styled/res/drawable-mdpi/ad_logo.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_menu_dropdown_panel_holo_light.9.png b/samples/styled/res/drawable-mdpi/ad_menu_dropdown_panel_holo_light.9.png
deleted file mode 100644
index 421b99b..0000000
--- a/samples/styled/res/drawable-mdpi/ad_menu_dropdown_panel_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_spinner_focused_holo_light.9.png b/samples/styled/res/drawable-mdpi/ad_spinner_focused_holo_light.9.png
deleted file mode 100644
index 5bbbf63..0000000
--- a/samples/styled/res/drawable-mdpi/ad_spinner_focused_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_spinner_pressed_holo_light.9.png b/samples/styled/res/drawable-mdpi/ad_spinner_pressed_holo_light.9.png
deleted file mode 100644
index f95e6d2..0000000
--- a/samples/styled/res/drawable-mdpi/ad_spinner_pressed_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_tab_selected_holo.9.png b/samples/styled/res/drawable-mdpi/ad_tab_selected_holo.9.png
deleted file mode 100644
index 14cdbd0..0000000
--- a/samples/styled/res/drawable-mdpi/ad_tab_selected_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_tab_selected_pressed_holo.9.png b/samples/styled/res/drawable-mdpi/ad_tab_selected_pressed_holo.9.png
deleted file mode 100644
index 04d3f6c..0000000
--- a/samples/styled/res/drawable-mdpi/ad_tab_selected_pressed_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ad_tab_unselected_holo.9.png b/samples/styled/res/drawable-mdpi/ad_tab_unselected_holo.9.png
deleted file mode 100644
index 458214c..0000000
--- a/samples/styled/res/drawable-mdpi/ad_tab_unselected_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/btn_check_off_holo_light.png b/samples/styled/res/drawable-mdpi/btn_check_off_holo_light.png
deleted file mode 100644
index a80c349..0000000
--- a/samples/styled/res/drawable-mdpi/btn_check_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/btn_check_on_holo_light.png b/samples/styled/res/drawable-mdpi/btn_check_on_holo_light.png
deleted file mode 100644
index 8fdb342..0000000
--- a/samples/styled/res/drawable-mdpi/btn_check_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/btn_radio_off_holo_light.png b/samples/styled/res/drawable-mdpi/btn_radio_off_holo_light.png
deleted file mode 100644
index c67e9fb..0000000
--- a/samples/styled/res/drawable-mdpi/btn_radio_off_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/btn_radio_on_holo_light.png b/samples/styled/res/drawable-mdpi/btn_radio_on_holo_light.png
deleted file mode 100644
index ed5acc9..0000000
--- a/samples/styled/res/drawable-mdpi/btn_radio_on_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ic_menu_refresh_holo_light.png b/samples/styled/res/drawable-mdpi/ic_menu_refresh_holo_light.png
deleted file mode 100644
index 604a4fd..0000000
--- a/samples/styled/res/drawable-mdpi/ic_menu_refresh_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ic_menu_star_holo_light.png b/samples/styled/res/drawable-mdpi/ic_menu_star_holo_light.png
deleted file mode 100644
index 77542c4..0000000
--- a/samples/styled/res/drawable-mdpi/ic_menu_star_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/ic_stat_android.png b/samples/styled/res/drawable-mdpi/ic_stat_android.png
deleted file mode 100644
index e91187d..0000000
--- a/samples/styled/res/drawable-mdpi/ic_stat_android.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/icon.png b/samples/styled/res/drawable-mdpi/icon.png
deleted file mode 100644
index 79f50d8..0000000
--- a/samples/styled/res/drawable-mdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/spinner_default_holo_light.9.png b/samples/styled/res/drawable-mdpi/spinner_default_holo_light.9.png
deleted file mode 100644
index c820e40..0000000
--- a/samples/styled/res/drawable-mdpi/spinner_default_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-mdpi/spinner_disabled_holo_light.9.png b/samples/styled/res/drawable-mdpi/spinner_disabled_holo_light.9.png
deleted file mode 100644
index 2dba270..0000000
--- a/samples/styled/res/drawable-mdpi/spinner_disabled_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable-xhdpi/icon.png b/samples/styled/res/drawable-xhdpi/icon.png
deleted file mode 100644
index 34ca9a4..0000000
--- a/samples/styled/res/drawable-xhdpi/icon.png
+++ /dev/null
Binary files differ
diff --git a/samples/styled/res/drawable/actionbar_tab_bg.xml b/samples/styled/res/drawable/actionbar_tab_bg.xml
deleted file mode 100644
index 9909909..0000000
--- a/samples/styled/res/drawable/actionbar_tab_bg.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/ad_tab_unselected_holo" />
-    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/ad_tab_selected_holo" />
-    <item android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/ad_tab_selected_pressed_holo" />
-    <item android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/ad_tab_selected_pressed_holo" />
-
-</selector>
diff --git a/samples/styled/res/drawable/ad_action_bar_gradient_bak.xml b/samples/styled/res/drawable/ad_action_bar_gradient_bak.xml
deleted file mode 100644
index 0233f4e..0000000
--- a/samples/styled/res/drawable/ad_action_bar_gradient_bak.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <gradient
-        android:startColor="@color/honeycombish_blue"
-        android:endColor="@color/background"
-        android:type="linear"
-        android:angle="270" />
-</shape>
\ No newline at end of file
diff --git a/samples/styled/res/drawable/ad_btn_check_holo_light.xml b/samples/styled/res/drawable/ad_btn_check_holo_light.xml
deleted file mode 100644
index ee2c57e..0000000
--- a/samples/styled/res/drawable/ad_btn_check_holo_light.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-	<!-- Enabled states -->
-	<item android:state_checked="true" android:state_window_focused="false"
-		android:state_enabled="true" android:drawable="@drawable/btn_check_on_holo_light" />
-	
-	<item android:state_checked="false" android:state_window_focused="false"
-		android:state_enabled="true" android:drawable="@drawable/btn_check_off_holo_light" />
-	
-	<item android:state_checked="true" android:state_pressed="true"
-		android:state_enabled="true" android:drawable="@drawable/ad_btn_check_on_pressed_holo_light" />
-	
-	<item android:state_checked="false" android:state_pressed="true"
-		android:state_enabled="true" android:drawable="@drawable/ad_btn_check_off_pressed_holo_light" />
-	
-	<!-- ignoring focused states for brevity 
-	<item android:state_checked="true" android:state_focused="true"
-		android:state_enabled="true" android:drawable="@drawable/btn_check_on_focused_holo_light" />
-	
-	<item android:state_checked="false" android:state_focused="true"
-		android:state_enabled="true" android:drawable="@drawable/btn_check_off_focused_holo_light" />
-	-->
-	
-	<item android:state_checked="false" android:state_enabled="true"
-		android:drawable="@drawable/btn_check_off_holo_light" />
-	
-	<item android:state_checked="true" android:state_enabled="true"
-		android:drawable="@drawable/btn_check_on_holo_light" />
-	
-	<!-- ignoring disabled states for brevity
-	<item android:state_checked="true" android:state_window_focused="false"
-		android:drawable="@drawable/btn_check_on_disabled_holo_light" />
-	
-	<item android:state_checked="false" android:state_window_focused="false"
-		android:drawable="@drawable/btn_check_off_disabled_holo_light" />
-	
-	<item android:state_checked="true" android:state_focused="true"
-		android:drawable="@drawable/btn_check_on_disabled_focused_holo_light" />
-	
-	<item android:state_checked="false" android:state_focused="true"
-		android:drawable="@drawable/btn_check_off_disabled_focused_holo_light" />
-	
-	<item android:state_checked="false"
-		android:drawable="@drawable/btn_check_off_disabled_holo_light" />
-	
-	<item android:state_checked="true"
-		android:drawable="@drawable/btn_check_on_disabled_holo_light" />
-	 -->
-	 
-</selector>
\ No newline at end of file
diff --git a/samples/styled/res/drawable/ad_btn_radio_holo_light.xml b/samples/styled/res/drawable/ad_btn_radio_holo_light.xml
deleted file mode 100644
index 15fc3ba..0000000
--- a/samples/styled/res/drawable/ad_btn_radio_holo_light.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-	<!-- Enabled states -->
-	<item android:state_checked="true" android:state_window_focused="false"
-		android:state_enabled="true" android:drawable="@drawable/btn_radio_on_holo_light" />
-	
-	<item android:state_checked="false" android:state_window_focused="false"
-		android:state_enabled="true" android:drawable="@drawable/btn_radio_off_holo_light" />
-	
-	<item android:state_checked="true" android:state_pressed="true"
-		android:state_enabled="true" android:drawable="@drawable/ad_btn_radio_on_pressed_holo_light" />
-	
-	<item android:state_checked="false" android:state_pressed="true"
-		android:state_enabled="true" android:drawable="@drawable/ad_btn_radio_off_pressed_holo_light" />
-	
-	<!-- ignoring focused states for brevity 
-	<item android:state_checked="true" android:state_focused="true"
-		android:state_enabled="true" android:drawable="@drawable/btn_radio_on_focused_holo_light" />
-	
-	<item android:state_checked="false" android:state_focused="true"
-		android:state_enabled="true" android:drawable="@drawable/btn_radio_off_focused_holo_light" />
-	-->
-	
-	<item android:state_checked="false" android:state_enabled="true"
-		android:drawable="@drawable/btn_radio_off_holo_light" />
-	
-	<item android:state_checked="true" android:state_enabled="true"
-		android:drawable="@drawable/btn_radio_on_holo_light" />
-	
-	<!-- ignoring disabled states for brevity
-	<item android:state_checked="true" android:state_window_focused="false"
-		android:drawable="@drawable/btn_radio_on_disabled_holo_light" />
-	
-	<item android:state_checked="false" android:state_window_focused="false"
-		android:drawable="@drawable/btn_radio_off_disabled_holo_light" />
-	
-	<item android:state_checked="true" android:state_focused="true"
-		android:drawable="@drawable/btn_radio_on_disabled_focused_holo_light" />
-	
-	<item android:state_checked="false" android:state_focused="true"
-		android:drawable="@drawable/btn_radio_off_disabled_focused_holo_light" />
-	
-	<item android:state_checked="false"
-		android:drawable="@drawable/btn_radio_off_disabled_holo_light" />
-	
-	<item android:state_checked="true"
-		android:drawable="@drawable/btn_radio_on_disabled_holo_light" />
-	-->
-		
-</selector>
\ No newline at end of file
diff --git a/samples/styled/res/drawable/ad_selectable_background.xml b/samples/styled/res/drawable/ad_selectable_background.xml
deleted file mode 100644
index bbb6800..0000000
--- a/samples/styled/res/drawable/ad_selectable_background.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-		  android:exitFadeDuration="@android:integer/config_mediumAnimTime" >
-	<item android:state_pressed="true" android:drawable="@drawable/selected_background" />
-	<item android:drawable="@android:color/transparent" />
-</selector>
\ No newline at end of file
diff --git a/samples/styled/res/drawable/ad_spinner_background_holo_light.xml b/samples/styled/res/drawable/ad_spinner_background_holo_light.xml
deleted file mode 100644
index d8d72bd..0000000
--- a/samples/styled/res/drawable/ad_spinner_background_holo_light.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_enabled="false"
-          android:drawable="@drawable/spinner_disabled_holo_light" />
-    <item android:state_pressed="true"
-          android:drawable="@drawable/ad_spinner_pressed_holo_light" />
-    <item android:state_pressed="false" android:state_focused="true"
-          android:drawable="@drawable/ad_spinner_focused_holo_light" />
-    <item android:drawable="@drawable/spinner_default_holo_light" />
-</selector>
diff --git a/samples/styled/res/drawable/rounded_rect.xml b/samples/styled/res/drawable/rounded_rect.xml
deleted file mode 100644
index bd0e341..0000000
--- a/samples/styled/res/drawable/rounded_rect.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <corners android:radius="@dimen/frag_rounding_radius" />
-</shape>
\ No newline at end of file
diff --git a/samples/styled/res/drawable/selected_background.xml b/samples/styled/res/drawable/selected_background.xml
deleted file mode 100644
index 546caf2..0000000
--- a/samples/styled/res/drawable/selected_background.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
-    <solid android:color="@color/android_green" />
-</shape>
diff --git a/samples/styled/res/layout/indeterminate_progress_action.xml b/samples/styled/res/layout/indeterminate_progress_action.xml
deleted file mode 100644
index 25b5ccb..0000000
--- a/samples/styled/res/layout/indeterminate_progress_action.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<ProgressBar
-  xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="wrap_content"
-  android:layout_height="wrap_content"
-  android:indeterminate="true"
-  android:layout_marginLeft="@dimen/progress_action_padding"
-  android:layout_marginRight="@dimen/progress_action_padding" />
diff --git a/samples/styled/res/layout/main.xml b/samples/styled/res/layout/main.xml
deleted file mode 100644
index dacc557..0000000
--- a/samples/styled/res/layout/main.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	android:id="@+id/root"
-    android:orientation="horizontal"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent" />
diff --git a/samples/styled/res/menu/main_menu.xml b/samples/styled/res/menu/main_menu.xml
deleted file mode 100644
index c705525..0000000
--- a/samples/styled/res/menu/main_menu.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
-	<!-- custom -->
-	<item android:id="@+id/menu_search" android:showAsAction="ifRoom"
-		android:title="@string/action_label_search" android:actionViewClass="android.widget.SearchView" />
-
-	<!-- icon -->
-	<item android:id="@+id/menu_refresh" android:showAsAction="ifRoom"
-		android:title="@string/action_label_refresh" android:icon="@drawable/ic_menu_refresh_holo_light" />
-
-	<!-- icon + text -->
-	<item android:id="@+id/menu_both" android:showAsAction="ifRoom|withText"
-		android:title="@string/action_label_both" android:icon="@drawable/ic_menu_star_holo_light" />
-
-	<!-- text -->
-	<item android:id="@+id/menu_text" android:showAsAction="ifRoom"
-		android:title="@string/action_label_text" />
-
-	<item android:id="@+id/menu_logo" android:showAsAction="ifRoom"
-		android:checkable="true" android:checked="false" android:title="@string/action_label_logo" />
-
-	<item android:id="@+id/menu_up" android:showAsAction="ifRoom"
-		android:checkable="true" android:checked="false" android:title="@string/action_label_up" />
-
-	<!-- Navigation submenu -->
-	<item android:id="@+id/menu_nav" android:title="@string/action_label_nav">
-		<menu>
-			<group android:id="@+id/menu_nav_group"
-				android:checkableBehavior="single">
-				
-				<item android:id="@+id/menu_nav_tabs" android:title="@string/action_label_nav_tabs" android:checked="true" />
-
-				<item android:id="@+id/menu_nav_drop_down" android:title="@string/action_label_nav_drop_down" />
-
-				<item android:id="@+id/menu_nav_label" android:title="@string/action_label_nav_label" />
-			</group>
-		</menu>
-	</item>
-
-	<!-- action bar background submenu -->
-	<item android:id="@+id/menu_bak" android:title="@string/action_label_bak">
-		<menu>
-			<group android:id="@+id/menu_bak_group"
-				android:checkableBehavior="single">
-				
-				<item android:id="@+id/menu_bak_none" android:title="@string/action_label_bak_none" android:checked="true" />
-
-				<item android:id="@+id/menu_bak_gradient" android:title="@string/action_label_bak_gradient" />
-
-				<!--<item android:id="@+id/menu_bak_9_patch" android:title="@string/action_label_image" />-->
-			</group>
-		</menu>
-	</item>
-
-</menu>
diff --git a/samples/styled/res/values/arrays.xml b/samples/styled/res/values/arrays.xml
deleted file mode 100644
index e6fd23a..0000000
--- a/samples/styled/res/values/arrays.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <string-array name="sections">
-        <item>Home</item>
-        <item>SDK</item>
-        <item>Dev Guide</item>
-        <item>Reference</item>
-        <item>Resources</item>
-        <item>Videos</item>
-        <item>Blog</item>
-    </string-array>
-</resources>
\ No newline at end of file
diff --git a/samples/styled/res/values/colors.xml b/samples/styled/res/values/colors.xml
deleted file mode 100644
index 4e6f727..0000000
--- a/samples/styled/res/values/colors.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <color name="android_green">#FFA4C639</color>
-    <color name="honeycombish_blue">#FF58BAED</color>
-    <color name="soft_grey">#FF777777</color>
-    <color name="background">#FFEFEFEF</color>
-</resources>
diff --git a/samples/styled/res/values/dimens.xml b/samples/styled/res/values/dimens.xml
deleted file mode 100644
index 0b21229..0000000
--- a/samples/styled/res/values/dimens.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <dimen name="frag_rounding_radius">20dp</dimen>
-    <dimen name="progress_action_padding">8dp</dimen>
-</resources>
\ No newline at end of file
diff --git a/samples/styled/res/values/strings.xml b/samples/styled/res/values/strings.xml
deleted file mode 100644
index f76eea9..0000000
--- a/samples/styled/res/values/strings.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-    <string name="application_name">ActionBarSherlock Styled</string>
-    <string name="activity_name">ABS: Styled</string>
-
-    <string name="action_label_refresh">Refresh</string>
-    <string name="action_label_search">Search</string>
-    <string name="action_label_both">Both</string>
-    <string name="action_label_text">Text</string>
-    <string name="app_name">Android Developers</string>
-    <string name="action_label_logo">Logo</string>
-    <string name="action_label_up">Up</string>
-    <string name="action_label_nav_tabs">Tabs</string>
-    <string name="action_label_nav_drop_down">List</string>
-    <string name="action_label_nav_label">Label</string>
-    <string name="action_label_nav">Navigation Mode &gt;</string>
-    <string name="action_label_bak">Action Bar Background &gt;</string>
-    <string name="action_label_bak_none">None</string>
-    <string name="action_label_bak_gradient">Gradient</string>
-    <string name="action_label_bak_image">Image</string>
-</resources>
diff --git a/samples/styled/res/values/styles.xml b/samples/styled/res/values/styles.xml
deleted file mode 100644
index 2669614..0000000
--- a/samples/styled/res/values/styles.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<resources>
-
-    <!-- Variation on the Holo Light theme that styles the Action Bar -->
-    <style name="Theme.AndroidDevelopers" parent="Theme.Sherlock.Light.ForceOverflow">
-        <item name="android:actionBarItemBackground">@drawable/ad_selectable_background</item>
-        <item name="actionBarItemBackground">@drawable/ad_selectable_background</item>
-        <item name="android:popupMenuStyle">@style/MyPopupMenu</item>
-        <item name="popupMenuStyle">@style/MyPopupMenu</item>
-        <item name="android:dropDownListViewStyle">@style/MyDropDownListView</item>
-        <item name="dropDownListViewStyle">@style/MyDropDownListView</item>
-        <item name="android:actionBarTabStyle">@style/MyActionBarTabStyle</item>
-        <item name="actionBarTabStyle">@style/MyActionBarTabStyle</item>
-        <item name="android:actionDropDownStyle">@style/MyDropDownNav</item>
-        <item name="actionDropDownStyle">@style/MyDropDownNav</item>
-        <item name="android:listChoiceIndicatorMultiple">@drawable/ad_btn_check_holo_light</item>
-        <item name="android:listChoiceIndicatorSingle">@drawable/ad_btn_radio_holo_light</item>
-        <!--<item name="android:actionOverflowButtonStyle">@style/MyOverflowButton</item>-->
-    </style>
-
-    <!-- style the overflow menu -->
-    <style name="MyPopupMenu" parent="Widget.Sherlock.Light.PopupMenu">
-        <item name="android:popupBackground">@drawable/ad_menu_dropdown_panel_holo_light</item>
-    </style>
-
-    <!-- style the items within the overflow menu -->
-    <style name="MyDropDownListView" parent="Widget.Sherlock.ListView.DropDown">
-        <item name="android:listSelector">@drawable/ad_selectable_background</item>
-    </style>
-
-    <!-- style for the tabs -->
-    <style name="MyActionBarTabStyle" parent="Widget.Sherlock.Light.ActionBar.TabBar">
-        <item name="android:background">@drawable/actionbar_tab_bg</item>
-        <item name="android:paddingLeft">32dp</item>
-        <item name="android:paddingRight">32dp</item>
-    </style>
-
-    <!-- style the list navigation -->
-    <style name="MyDropDownNav" parent="Widget.Sherlock.Light.Spinner.DropDown.ActionBar">
-        <item name="android:background">@drawable/ad_spinner_background_holo_light</item>
-        <item name="android:popupBackground">@drawable/ad_menu_dropdown_panel_holo_light</item>
-        <item name="android:dropDownSelector">@drawable/ad_selectable_background</item>
-    </style>
-
-    <!-- the following can be used to style the overflow menu button
-         only do this if you have an *extremely* good reason to!! -->
-    <!--<style name="MyOverflowButton" parent="Widget.Sherlock.ActionButton.Overflow">
-        <item name="android:src">@drawable/ic_menu_view</item>
-        <item name="android:background">@drawable/action_button_background</item>
-    </style>-->
-
-</resources>
\ No newline at end of file
diff --git a/samples/styled/src/com/actionbarsherlock/sample/styled/MainActivity.java b/samples/styled/src/com/actionbarsherlock/sample/styled/MainActivity.java
deleted file mode 100644
index 270b888..0000000
--- a/samples/styled/src/com/actionbarsherlock/sample/styled/MainActivity.java
+++ /dev/null
@@ -1,210 +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.actionbarsherlock.sample.styled;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.v4.app.FragmentTransaction;
-import android.widget.ArrayAdapter;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.app.SherlockFragmentActivity;
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
-import com.nineoldandroids.animation.ObjectAnimator;
-
-import static com.actionbarsherlock.app.ActionBar.OnNavigationListener;
-import static com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener;
-
-public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener {
-
-    private final Handler handler = new Handler();
-    private RoundedColourFragment leftFrag;
-    private RoundedColourFragment rightFrag;
-    private boolean useLogo = false;
-    private boolean showHomeUp = false;
-
-    /** Called when the activity is first created. */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.main);
-        final ActionBar ab = getSupportActionBar();
-
-        // set defaults for logo & home up
-        ab.setDisplayHomeAsUpEnabled(showHomeUp);
-        ab.setDisplayUseLogoEnabled(useLogo);
-
-        // set up tabs nav
-        for (int i = 1; i < 4; i++) {
-            ab.addTab(ab.newTab().setText("Tab " + i).setTabListener(this));
-        }
-
-        // set up list nav
-        ab.setListNavigationCallbacks(ArrayAdapter
-                .createFromResource(this, R.array.sections,
-                        R.layout.sherlock_spinner_dropdown_item),
-                new OnNavigationListener() {
-                    public boolean onNavigationItemSelected(int itemPosition,
-                            long itemId) {
-                        // FIXME add proper implementation
-                        rotateLeftFrag();
-                        return false;
-                    }
-                });
-
-        // default to tab navigation
-        showTabsNav();
-
-        // create a couple of simple fragments as placeholders
-        final int MARGIN = 16;
-        leftFrag = new RoundedColourFragment(getResources().getColor(
-                R.color.android_green), 1f, MARGIN, MARGIN / 2, MARGIN, MARGIN);
-        rightFrag = new RoundedColourFragment(getResources().getColor(
-                R.color.honeycombish_blue), 2f, MARGIN / 2, MARGIN, MARGIN,
-                MARGIN);
-
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-        ft.add(R.id.root, leftFrag);
-        ft.add(R.id.root, rightFrag);
-        ft.commit();
-    }
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        getSupportMenuInflater().inflate(R.menu.main_menu, menu);
-
-        // set up a listener for the refresh item
-        final MenuItem refresh = (MenuItem) menu.findItem(R.id.menu_refresh);
-        refresh.setOnMenuItemClickListener(new OnMenuItemClickListener() {
-            // on selecting show progress spinner for 1s
-            public boolean onMenuItemClick(MenuItem item) {
-                // item.setActionView(R.layout.progress_action);
-                handler.postDelayed(new Runnable() {
-                    public void run() {
-                        refresh.setActionView(null);
-                    }
-                }, 1000);
-                return false;
-            }
-        });
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-        case android.R.id.home:
-            // TODO handle clicking the app icon/logo
-            return false;
-        case R.id.menu_refresh:
-            // switch to a progress animation
-            item.setActionView(R.layout.indeterminate_progress_action);
-            return true;
-        case R.id.menu_both:
-            // rotation animation of green fragment
-            rotateLeftFrag();
-            return true;
-        case R.id.menu_text:
-            // alpha animation of blue fragment
-            ObjectAnimator alpha = ObjectAnimator.ofFloat(rightFrag.getView(),
-                    "alpha", 1f, 0f);
-            alpha.setRepeatMode(ObjectAnimator.REVERSE);
-            alpha.setRepeatCount(1);
-            alpha.setDuration(800);
-            alpha.start();
-            return true;
-        case R.id.menu_logo:
-            useLogo = !useLogo;
-            item.setChecked(useLogo);
-            getSupportActionBar().setDisplayUseLogoEnabled(useLogo);
-            return true;
-        case R.id.menu_up:
-            showHomeUp = !showHomeUp;
-            item.setChecked(showHomeUp);
-            getSupportActionBar().setDisplayHomeAsUpEnabled(showHomeUp);
-            return true;
-        case R.id.menu_nav_tabs:
-            item.setChecked(true);
-            showTabsNav();
-            return true;
-        case R.id.menu_nav_label:
-            item.setChecked(true);
-            showStandardNav();
-            return true;
-        case R.id.menu_nav_drop_down:
-            item.setChecked(true);
-            showDropDownNav();
-            return true;
-        case R.id.menu_bak_none:
-            item.setChecked(true);
-            getSupportActionBar().setBackgroundDrawable(null);
-            return true;
-        case R.id.menu_bak_gradient:
-            item.setChecked(true);
-            getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.ad_action_bar_gradient_bak));
-            return true;
-        default:
-            return super.onOptionsItemSelected(item);
-        }
-    }
-
-    private void rotateLeftFrag() {
-        if (leftFrag != null) {
-            ObjectAnimator.ofFloat(leftFrag.getView(), "rotationY", 0, 180)
-                    .setDuration(500).start();
-        }
-    }
-
-    private void showStandardNav() {
-        ActionBar ab = getSupportActionBar();
-        if (ab.getNavigationMode() != ActionBar.NAVIGATION_MODE_STANDARD) {
-            ab.setDisplayShowTitleEnabled(true);
-            ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
-        }
-    }
-
-    private void showDropDownNav() {
-        ActionBar ab = getSupportActionBar();
-        if (ab.getNavigationMode() != ActionBar.NAVIGATION_MODE_LIST) {
-            ab.setDisplayShowTitleEnabled(false);
-            ab.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
-        }
-    }
-
-    private void showTabsNav() {
-        ActionBar ab = getSupportActionBar();
-        if (ab.getNavigationMode() != ActionBar.NAVIGATION_MODE_TABS) {
-            ab.setDisplayShowTitleEnabled(false);
-            ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-        }
-    }
-
-    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
-        // FIXME add a proper implementation, for now just rotate the left
-        // fragment
-        rotateLeftFrag();
-    }
-
-    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
-        // FIXME implement this
-    }
-
-    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
-        // FIXME implement this
-    }
-
-}
\ No newline at end of file
diff --git a/samples/styled/src/com/actionbarsherlock/sample/styled/RoundedColourFragment.java b/samples/styled/src/com/actionbarsherlock/sample/styled/RoundedColourFragment.java
deleted file mode 100644
index 411f632..0000000
--- a/samples/styled/src/com/actionbarsherlock/sample/styled/RoundedColourFragment.java
+++ /dev/null
@@ -1,72 +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.actionbarsherlock.sample.styled;
-
-import android.graphics.drawable.GradientDrawable;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.LinearLayout;
-import com.actionbarsherlock.app.SherlockFragment;
-
-public class RoundedColourFragment extends SherlockFragment {
-
-    private View mView;
-    private int mColour;
-    private float mWeight;
-    private int marginLeft, marginRight, marginTop, marginBottom;
-
-    // need a public empty constructor for framework to instantiate
-    public RoundedColourFragment() {
-
-    }
-
-    public RoundedColourFragment(int colour, float weight, int margin_left,
-            int margin_right, int margin_top, int margin_bottom) {
-        mColour = colour;
-        mWeight = weight;
-        marginLeft = margin_left;
-        marginRight = margin_right;
-        marginTop = margin_top;
-        marginBottom = margin_bottom;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mView = new View(getActivity());
-
-        GradientDrawable background = (GradientDrawable) getResources()
-                .getDrawable(R.drawable.rounded_rect);
-        background.setColor(mColour);
-
-        mView.setBackgroundDrawable(background);
-        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0,
-                LayoutParams.FILL_PARENT, mWeight);
-        lp.setMargins(marginLeft, marginTop, marginRight, marginBottom);
-        mView.setLayoutParams(lp);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        return mView;
-    }
-
-}
